StreamReader.ReadLine() - eine klitze kleine frage

nerv_nich

Grünschnabel
Hi,
ich habe einen Artikel über Networking auf der MSDN Seite gefunden aber eine kleine Passage versteh ich nicht.
http://www.microsoft.com/germany/msdn/library/net/csharp/NetworkingMitCSharp.mspx?mfr=true

im Listing 6, also fast ganz unten wird der Stream zwischen Client und Server gelesen
Code:
try
      {
        // Hole nächsten Zeitstring vom Server
        String time = inStream.ReadLine ();
        // Setze das Schleifen-Flag zurück
        // wenn der Server aufgehört hat zu senden
        loop = !time.Equals ( "" );
        // Gib die Zeit auf der Console aus
        Console.WriteLine ( time );
      }

Wenn ich den server nach jedem Senden z.B. 5 Sekunden anhalte bricht der Client nicht ab, obwohl er abfragt ob ReadLine etwas ausgelesen hat und bei nem leeren String aus der Schleife gehen würde.
Liest ReadLine eintfach weiter obwohl der Server nichts sendet oder was passiert da? und wann bricht er ab? zu irgendwas muss die Zeile doch gut sein.
wär nett wenn mir das einer erklären könnte.

mfg
 
Hi!

Ich habe mich ebenfalls mit dem Beispiel beschäftigt.

Wie hast du denn den Server unterbrochen? Direkt nach dem Senden der time-Variable, wie hier gezeigt (Klasse ServerThread)?

Code:
while (loop)
{
  // fetch current time
  String time = DateTime.Now.ToString();
  // send time when it differs from the previous sent message
  if (!time.Equals(buffer))
  {
    // convert the time string to a byte-array and add 
    // a carriage-return linefeed
    Byte[] tosend = Encoding.ASCII.GetBytes(time + "\r\n");
    // send bytes to the client
    ostream.Write(tosend, 0, tosend.Length);
    // save sent time
    buffer = time;
  }

  
  // HALTE DEN THREAD FÜR 5 SEKUNDEN AN
  Thread.Sleep(5000);
  
  
  loop = !this.STOP;
}

Wenn dem so ist, dann denke ich, dass der gesamte Thread des Clients aufgehalten wird, also auch das Lesen des Streams. Leider bin ich nicht der Spezialist was Threads angeht, für mich wäre das aber eine logische Erklärung. Der Client ist ja diesem Thread zugeordnet. Ersetzt man beim Senden des Byte-Arrays die Variable time durch "", so bricht, zumindest bei mir, der Client ordnungsgemäß ab.

Gruß,
Tom
 
ich habe im lese-thread kein sleep. einen schreibthread habe ich im client nicht, da er nur infos abruft. im server sieht das alles so ähnlich aus aber da sind alle interaktionen in verschiedenen threads...
hier mein code, so hab ich das jetzt am laufen

Code:
        public void Run()
        {
            // so lage versuchen zu connecten bis es funktioniert hat
            connect();
            this._runrunning = true;
            bool loop = !this.stop;
            while (loop)
            {
                try
                {
                    string ReadTXT = inStream.ReadLine();
                    // CODE ....
                    //...
                    //...
                    //...
                }
                catch (Exception ex)
                {
                    FrontEndControl.UpdateBotLog("#### Fehler: " + ex.Message + Environment.NewLine, identstring);
                    FrontEndControl.UpdateBotLog(ex.StackTrace + Environment.NewLine, identstring);
                    connect();
                }
                loop = !this.stop;
            }
            // Schließe die Verbindung zum Client
            this.connection.Close();
            // Setze das Flag "Thread läuft" zurück
            this._runrunning = false;
        }

ich denke der erfolg von ReadLine hängt nicht davon ab ob aktuell etwas im stream steht sondern ob die verbindung steht und er wartet einfach bis etwas gesendet wid.
 

Neue Beiträge

Zurück