Dauerhaft über TCP-Socket Daten empfangen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Lt.Winters.

    Dauerhaft über TCP-Socket Daten empfangen

    Hallo zusammen,

    ich baue eine TCP-Client Verbindung zu einem Server auf und schicke diesem über einen NetworkStream einfache Befehle. Nun kann ich auch Befehle empfangen indem ich direkt nach dem Senden mir den ankommenden String ausgeben lasse. ABER wie kann ich dauerhaft Zeichen empfangen und diese in einer RTB anzeigen lassen?

    VB.NET-Quellcode

    1. Sub XY()
    2. Dim TestSocket As New System.Net.Sockets.TcpClient()
    3. TestSocket.Connect("127.0.0.1", 1111)
    4. 'Stream aufsetzen
    5. Dim NetworkstreamSocket As NetworkStream = TestSocket.GetStream()
    6. If NetworkstreamSocket.CanWrite And NetworkstreamSocket.CanRead Then
    7. 'Irgendeine Aktion
    8. Else
    9. MsgBox("Fehler!")
    10. NetworkstreamSocket.Close()
    11. Exit Sub
    12. End If
    13. 'Daten senden
    14. Dim DatenSenden As Byte() = Encoding.GetEncoding(1252).GetBytes("irgendwelche Befehle" & vbCrLf)
    15. NetworkstreamSocket.Write(DatenSenden, 0, DatenSenden.Length)
    16. 'Daten empfangen
    17. NetworkstreamSocket.ReadTimeout = 10000 'Timeout Verbindungssocket
    18. Dim ReceiveBytesVb(TestSocket.ReceiveBufferSize) As Byte
    19. NetworkstreamSocket.Read(ReceiveBytesVb, 0, CInt(TestSocket.ReceiveBufferSize))
    20. 'Daten ausgeben
    21. Dim ReturnDataVb As String = Encoding.GetEncoding(1252).GetString(ReceiveBytesVb)
    22. RichTextBox1.Text = ReturnDataVb
    23. End Sub
    Warum dauerhaft?
    Ist doch nur unnötige Netzwerkauslastung?!
    Irgendwas wird ja bestimmt auf einer Seite gemacht bzw geändert.
    Hier kann man auf Events bauen und dann nur die Daten auslesen, senden wenn sich was ändert.
    Schau dir den Versuchschat von EDR mal und dann siehst du wie es funktionieren würde. Du kannst auch einfach den Stream inner Schleife abhören und warten bis ein Befehl ankommt. Natürlich in einen anderen Thread auslagern.
    Danke den Versuchschat werde ich mir mal ansehen.

    Das mit der Schleife habe ich probiert, allerdings hängt sich dann meine Form auf, was wohl daran liegt, dass ich es nicht ausgelagert habe :/ Da muss ich dann erstmal schauen wie das geht.

    Edit:
    Jetzt muss ich nochmal nerven. Also das mit dem Versuchschat habe ich mir angesehen, aber ehrlich gesagt überhaupt nicht verstanden. EDR sagt ja auch in OOP muss man dafür fit sein, was ich nicht bin :D

    So daher möchte ich gerne die Schleifenlösung verwenden. Da das, wie bereits geschrieben, nicht ohne Multithreading geht, habe ich mich damit etwas näher beschäftigt. Allerdings funktioniert die Lösung nicht so richtig.

    Sry ich weiß leider nicht, warum er den Code so verrutscht :/

    VB.NET-Quellcode

    1. DimSocket As New System.Net.Sockets.TcpClient()
    2. Dim ThreadTcpDatenLesen As New System.Threading.Thread(AddressOf TcpDatenLesen)
    3. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    4. 'Connect-Button
    5. Socket.Connect(IP, Port)
    6. End Sub
    7. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    8. 'Disconnect-Button
    9. Socket.Close()
    10. End Sub
    11. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    12. 'Text-Befehle senden
    13. Try
    14. Dim NetworkstreamSocket As NetworkStream = Socket.GetStream()
    15. 'Daten senden
    16. Dim Befehl As String = TextBox1.Text
    17. Dim Senden As Byte() = Encoding.GetEncoding(1252).GetBytes(Befehl & vbCrLf)
    18. NetworkstreamSocket.Write(Senden, 0, Senden.Length)
    19. ThreadTcpDatenLesen.Start()
    20. End Sub
    21. Sub TcpDatenLesen()
    22. Try
    23. Dim NetworkstreamSocket As NetworkStream = Socket.GetStream()
    24. 'Daten empfangen
    25. NetworkstreamSocket.ReadTimeout = 10000 'Timeout Verbindungssocket
    26. Dim ReceiveBytesVb(Socket.ReceiveBufferSize) As Byte
    27. NetworkstreamSocket.Read(ReceiveBytesVb, 0, CInt(Socket.ReceiveBufferSize))
    28. 'Daten ausgeben
    29. Dim i As Integer = Socket.ReceiveBufferSize
    30. Dim Test As String = Encoding.GetEncoding(1252).GetString(ReceiveBytesVb)
    31. While (i > 0)
    32. RichTextBox1.AppendText(Test) 'Status anzeigen
    33. Me.Refresh()
    34. RichTextBox1.ScrollToCaret()
    35. End While
    36. Catch ex As Exception
    37. End Try
    38. End Sub



    Posts zusammengefügt
    -Artentus

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    Lt.Winters schrieb:

    in OOP muss man dafür fit sein, was ich nicht bin
    Das sind aber sehr schlechte Vorraussetzungen. Bitte dieses Buch lesen (hingegen das Galileio-Openbook ist Mist).
    Mit freundlichen Grüßen,
    Thunderbolt

    ​Thunderbolt schrieb:

    ]Das sind aber sehr schlechte Vorraussetzungen. Bitte dieses Buch lesen (hingegen das Galileio-Openbook ist Mist).


    Was heißt denn hier schlechte Vorraussetzungen? Ich finde das immer so herrlich hier. Jeder fängt doch mal klein an oder etwas nicht? Wusstet ihr direkt von Geburt an alles und konntet godlike in vb.net programmieren? Ich denke nicht ;)

    So genug OT und zurück zum Thema:

    Ich habe mittels Delegate und Invoke einen Thread erstellt, in welchem folgende Abfrage Schleife läuft. Nur ein Problem ergibt sich leider nicht, die Schleife läuft ewig weiter, auch wenn die ReceiveBufferSize = 0 ist.

    VB.NET-Quellcode

    1. Sub TcpDatenLesen()
    2. Try
    3. NetworkstreamSocket = Socket.GetStream
    4. 'Daten empfangen
    5. NetworkstreamSocket.ReadTimeout = 10000 'Timeout Verbindungssocket
    6. Dim ReceiveBytesVb(Socket.ReceiveBufferSize) As Byte
    7. NetworkstreamSocket.Read(ReceiveBytesVb, 0, CInt(Socket.ReceiveBufferSize))
    8. 'Daten ausgeben
    9. Dim ReturnData As String = Encoding.GetEncoding(1252).GetString(ReceiveBytesVb)
    10. Dim i As Integer = Socket.ReceiveBufferSize
    11. While (i > 0)
    12. Dim Test As String = Encoding.GetEncoding(1252).GetString(ReceiveBytesVb)
    13. Dim SendObject As Object
    14. SendObject = Test
    15. Me.Invoke(New TcpDatenLesenCallback(AddressOf ApplyValues), SendObject)
    16. Thread.Sleep(100)
    17. End While
    18. Catch ex As Exception
    19. End Try

    Lt.Winters schrieb:

    Wusstet ihr direkt von Geburt an alles und konntet godlike in vb.net programmieren? Ich denke nicht ;)
    Nein. Dafür haben wir solche Bücher gelesen. OOP sollte man beherrschen...
    Mit freundlichen Grüßen,
    Thunderbolt
    So, nun bin ich am PC und muss nicht von Mobiltelefon posten :D

    Lt.Winters schrieb:

    die Schleife läuft ewig weiter, auch wenn die ReceiveBufferSize = 0
    Sicher? Normalerweise ist ein Buffer immer gleich groß. Was willst du da erreichen? Ich sehe da nur, dass du immer wieder die selbe Bytesequenz in einen String umwandelst und an eine Methode weitergibst. Warum eigentlich das? Das ist auch in einer Zeile möglich...

    VB.NET-Quellcode

    1. Dim Test As String = Encoding.GetEncoding(1252).GetString(ReceiveBytesVb)
    2. Dim SendObject As Object
    3. SendObject = Test
    4. Me.Invoke(New TcpDatenLesenCallback(AddressOf ApplyValues), SendObject)

    Übrigens: Du weist i nie einen neuen Wert zu, d. h., dass wenn die Schleife einmal gestartet wurde, wird sie ewig weiterlaufen.
    Und auch noch lesenswert: TryCatch ist ein heißes Eisen
    Eventuell solltest du dein Try-Catch spezialisieren.
    Mit freundlichen Grüßen,
    Thunderbolt