TCP - StreamReader Problem

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Load-soft.ch.vu.

    TCP - StreamReader Problem

    Hey,
    ich hab ein Problem mit dem StreamReader bei TCP. Das Problem tritt aber nur beim Server, nicht beim Client auf, was mich etwas wundert...
    Erstmal der Code (Server):

    VB.NET-Quellcode

    1. Sub mainserver()
    2. Try
    3. Server = New TcpListener(ipendpoint)
    4. Server.Start()
    5. client = Server.AcceptTcpClient
    6. stream = client.GetStream
    7. streamr = New StreamReader(stream)
    8. streamw = New StreamWriter(stream)
    9. While True
    10. x = streamr.ReadLine
    11. RichTextBox1.Text = x
    12. End While
    13. Catch
    14. End Try
    15. End Sub


    Wenn jetzt der Client dem Server etwas schreibt, dann wird das nur ein einziges Mal in der RichTextBox angeziegt. Danach passiert einfach nichts mehr.
    Wenn man den Text aber in ner MsgBox, statt in der RichTextBox ausgibt, dann funktioniert es so oft man will. Aber weil ich einen Chat programmieren möchte, sollte der Text nicht nur ein einziges Mal angezeigt werden sondern in der RichTextBox gespeichert werden. (Im richtigen Code wird der Text der RichTextBox hinten dran gehängt).
    Ich wäre echt froh wenn mir jmd erklären könnte warum das nicht funktioniert, ich bin echt am Verzweifeln.
    Du weißt ja immer auch nur das aktuell ausgelesene zu

    RichTextbox1.Text &= x fügt den neuen Text hinzu, wobei eine Endlosschleife hier fehl am platz ist bei so einer Zuweisung, da fürde ich eher mit Seek oder so arbeiten, bzw. Abfragen ob die Variablen x Zeichen enthält und nur dann sie der RTB zuweisen.
    Das ich immer nur das aktuelle sehe ist klar ich hab das im echten code noch komlizierter aber hab das hier nur rausgekürzt, damits überischtlicher bleibt :D
    Warum keine endlosschleife? Mit ner MsgBox gehts ja. Und wie geht das mit seek?
    über ein bisschen code würd ich mich freuen...
    In streamr.Seek sind die neuen Zeichen enthalten, wobei das hier auch nichts bringt wenn ichs mir recht überlege ^^ der Stream soll ka kontinuierlich abgefragt werden. Ich nutze Seek halt wenn ich neuen Inhalt eines Streams auslesen möchte, z.B. sende ich in den Streamwriter einen befehl und gleich danach kommt über den Streamreader was zurück. Also Seek muss immer wieder neu ausgeführt werden, bsp.:

    VB.NET-Quellcode

    1. streamw.WriteLine("Befehl")
    2. While Not streamr.Seek = -1
    3. ' stream einlesen, schleife läuft solange, wie sich was noch nicht eingelesenes im Stream befindet.
    4. End While


    Aber wie gesagt das bringt dir nichts und wenn du sagst mit der Textbox gehts aber RTB nicht .. hmm weiß auch nicht das klingt unlogisch. Mal mit ner normalen Textbox versucht?

    Achso und hau mal in die Catch Anweisung noch eine Messagebox Ausgabe rein, damit du merkst ob eine Exception ausgeworfen wird.
    lol....
    ich hab davor immer den server von vb aus mit debuggen gestartet und den Client mit der .exe. Jetzt hab ich mal beide mit der exe angemacht, weil ich schon alles andere porbiert hab und jz gehts...
    Ich versteh das nicht. Auch wenn das jetzt geht würd ich gerne wissen warum das mit der exe auf einmal funktioniert.

    Der Server ist ins catch event gegangen und hat da die msgbox ausgeworfen. Aber nur einmal danach hat er nichts mehr gemacht, ist aber auch nicht abgestürzt. Dann dachte ich mir, ich tu das StreamReader-Ding mal aus der Try schleife raus. Im Debuggen-Modus von VB ist es dann abgekackt. Mit den exe'n aber nicht...
    Das verwirrt mich nur noch mehr...
    Nun ist ja klar das der Catch nur einmal ausgeführt wird. In der While Schleife tritt ein Fehler auf und somit wird die Schleife verlassen und das Catch Ereignis aufgerufen, danach wird die Sub Routine verlassen.
    Deswegen stürzt das Programm natürlich auch ab wenn es aus dem Try Catch nimmst.

    Wieso es aber als erstelltes Programm funktioniert ist mir rätselhaft O.o
    Ich hab jetzt herausgefunden warum es manchmal ging und manchmal nicht^^

    Das Programm hat sich net richtig geschlossen, also musste ich es mit dem Task-Manager über Prozess beenden schließen...
    Danach geht es dann wieder. Nun frage ich mich aber wie ich das sofort beende ohne über den Task-Manager zu gehen.
    Ich habs schon mit application.exit() versucht, das klappt aber nicht.