Mini Chat funktioniert nocht nicht ganz

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Mini Chat funktioniert nocht nicht ganz

    Hallo ich hab nach dem Semper-Video Tutorial versucht ein kleines Chat Programm zu erstellen. Der Code sieht wie folgt aus:

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Threading
    3. Imports System.IO
    4. Imports System.Windows.Threading
    5. Class MainWindow
    6. Dim listener As New TcpListener(55555)
    7. Dim client As TcpClient
    8. Dim message As String = ""
    9. Dim timer As New DispatcherTimer
    10. Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
    11. Dim listthread As New Thread(New ThreadStart(AddressOf listening))
    12. listthread.Start()
    13. timer.Interval = New TimeSpan(0, 0, 1)
    14. timer.IsEnabled = True
    15. AddHandler timer.Tick, AddressOf dispatcherTimer_Tick
    16. timer.Start()
    17. End Sub
    18. Private Sub listening()
    19. listener.Start()
    20. client = listener.AcceptTcpClient
    21. End Sub
    22. Private Sub MainWindow_Closed(sender As Object, e As EventArgs) Handles Me.Closed
    23. listener.Stop()
    24. End Sub
    25. Private Sub cmdSend_Click(sender As Object, e As RoutedEventArgs) Handles cmdSend.Click
    26. Try
    27. client = New TcpClient(txtZiel.Text, 55555)
    28. Dim writer As New StreamWriter(client.GetStream)
    29. writer.Write(txtEmpfang.Text)
    30. writer.Flush()
    31. Catch ex As Exception
    32. MsgBox(ex.Message)
    33. End Try
    34. End Sub
    35. Private Sub dispatcherTimer_Tick(sender As Object, e As EventArgs)
    36. Try
    37. If listener.Pending = True Then
    38. message = ""
    39. Dim reader As New StreamReader(client.GetStream)
    40. While reader.Peek > -1
    41. message = message + Convert.ToChar(reader.Read()).ToString
    42. End While
    43. txtEmpfang.Text = txtEmpfang.Text & message & vbCrLf
    44. End If
    45. Catch ex As Exception
    46. MsgBox(ex.Message)
    47. End Try
    48. End Sub
    49. End Class


    Allerdings bekomme ich im txtEmpfang keine Message rein...
    Das liegt daran, dass der Code von Sempervideo ziemlich ranzig ist. Warum jedes mal einen neuen TcpClient erstellen, wenn man etwas senden möchte? Das führt zum Slow-Start-Problem.

    Genau so ist es Unfug, einen DispatcherTimer für das lesen des Streams zu benutzen, und dann auch noch jedes mal einen neuen StreamWriter zu erstellen.

    Try-Ctach-Blöcke zu benutzen, um Fehlermeldungen in einer MessageBox auszugeben, entspricht nicht deren Sinn und ist unter allen Umständen zu meiden. @ErfinderDesRades hat das mal unter dem Titel "TryCatch ist ein heißes Eisen" zusammengefasst.

    Die StreamReader werden außerdem nicht geschlossen bzw. disposed. Ebenso fehlt ein Handling für einen unerwarteten Verbindungsabbruch. Wenn du den Server schließt, während der Client noch an der Strippe hängt, fliegt dir alles um die Ohren.

    Ich könnte noch ein Weilchen so weiter machen und dir Lösungsansätze für all das liefern, verweise dich aber stattdessen lieber auf den VersuchsChat mit leistungsfähigem Server von EDR - da wirds so gemacht, wie es sein sollte.

    Echt, meide SemperVideo und jegliche andere Youtube-Quellen. 99% davon sind qualitativ Grütze.