Laden...

streamreader.readline methode fängt alles?

Erstellt von IchUndDeineMama vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.424 Views
I
IchUndDeineMama Themenstarter:in
18 Beiträge seit 2009
vor 14 Jahren
streamreader.readline methode fängt alles?

Hallo kann mir jemand sagen ob diese aussagen so stimmen.:

Also ich habe ein Client/Server Paar.Der Server empfängt vom Client eine Zeile und schreibt dann irgendwas zurück.

Also macht der client


server = TcpListener(4296);
TcpClient c = server..AcceptTcpClient();
  StreamReader r = new StreamReader(  c.GetStream());
String s =r.readLine();

//machwas

// irgendwas zurückschicken.

1.r.readLine() blockiert doch bis Daten verfügbar sind?

  1. Wenn der String sehr lange ist und sehr langsam übertragen wird, ist dann trotzdem sichergestellt das r.readLine() bis zum /n Zeichen wartet? Oder nimmt readLine() nur das was gerade gepuffert ist und denkt der Stream ist am Ende?

3.Wie ist den readline intern programmiert? Macht der immer read(ein paar bytes puffern) , schauen ob /n vorkommt, wenn nciht dann wieder ein read(), und falls read() längere Zeit blockiert macht er ein Timeout?

Bin dankbar um aufklärung 😃

M
205 Beiträge seit 2008
vor 14 Jahren

Abend,

hab dir den code aus dem refvlector kopiert, damit sollte klar sein wie diue methode aufgebaut ist 😉


public override string ReadLine()
{
    if (this.stream == null)
    {
        __Error.ReaderClosed();
    }
    if ((this.charPos == this.charLen) && (this.ReadBuffer() == 0))
    {
        return null;
    }
    StringBuilder builder = null;
    do
    {
        int charPos = this.charPos;
        do
        {
            char ch = this.charBuffer[charPos];
            switch (ch)
            {
                case '\r':
                case '\n':
                    string str;
                    if (builder != null)
                    {
                        builder.Append(this.charBuffer, this.charPos, charPos - this.charPos);
                        str = builder.ToString();
                    }
                    else
                    {
                        str = new string(this.charBuffer, this.charPos, charPos - this.charPos);
                    }
                    this.charPos = charPos + 1;
                    if (((ch == '\r') && ((this.charPos < this.charLen) || (this.ReadBuffer() > 0))) && (this.charBuffer[this.charPos] == '\n'))
                    {
                        this.charPos++;
                    }
                    return str;
            }
            charPos++;
        }
        while (charPos < this.charLen);
        charPos = this.charLen - this.charPos;
        if (builder == null)
        {
            builder = new StringBuilder(charPos + 80);
        }
        builder.Append(this.charBuffer, this.charPos, charPos);
    }
    while (this.ReadBuffer() > 0);
    return builder.ToString();
}

mfg