TCP Client StreamReader blockiert Form

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    TCP Client StreamReader blockiert Form

    Hallo Leute!

    Vorweg: Ich bin mit der objektorientierten Programmierung nicht vertraut, nutze aber Visual Basic Express 2010 wegen der sehr komfortablen Windows-Entwicklungsumgebung.

    Mein Problem:
    Ich möchte mittels TCP Socket Daten mit anderen Rechnern austauschen.
    Der Client soll mittels Visual Basic Express 2010 auf einem PC laufen.
    Habe mir bereits sehr viele Beispiele zu TCP-Clients im Netz angesehen und ausprobiert,
    aber ich bekomme es einfach nicht hin, dass der StreamReader nicht meine Form blockiert.
    Habe auch versucht, den StreamReader in einen separaten Thread zu verpacken, aber irgendwie
    funktioniert das trotzdem nicht - soll heißen: blockiert meine Form immer noch.
    Habe auch über non-blocking Sockets und asynchrone Bearbeitung gelesen, finde dazu aber keine Beispiele
    in VB.

    Bitte um eure Unterstützung!

    MontaNus1309

    Thema aus Tutorialbereich verschoben, bitte darauf achten. ~NoFear23m

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

    @MontaNus1309 Willkommen im Forum. :thumbup:
    Vielleicht postest Du mal Dein bereinigtes (ohne bin- und obj-Verzeichnis) gezipptes Projekt, da finden wir den Fehler leichter.
    Erweiterte Antwort => Dateianhänge => Hochladen
    Und:
    Lade Dir mal ein neueres Studio runter, 2017 oder 2019.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    MontaNus1309 schrieb:

    Mein Projekt im Anhang.
    Ja und?

    Was sagt Dir das?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @MontaNus1309 dass wir Dir in diesem Zustand nicht helfen können.
    Kannst Du den Code einer lokalen Gegenstelle (am selben PC) posten?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo RodFromGermany,
    die Gegenstelle (der Server) ist ein Raspberry Pi.
    Der Code dafür ist in Python geschrieben.

    Hättest du möglicherweise einen Beispielcode in VB,
    der einen nicht blockierenden TCP-Client macht?
    An meinem ursprünglichen (oben geposteten) VB Code hänge ich nicht besonders.

    Schöne Grüße,

    MontaNus1309
    @MontaNus1309 Ohne einen Code, der den Effekt reproduziert, ist das alles Spekulatius, da ist eine fundierte Hilfe schlecht möglich (nicht unmöglich).
    Ich werd mal am Wochenende reinschauen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    MontaNus1309 schrieb:

    hier der Python-Code
    Da seh ich rein in ein vernebeltes Uhrwerk.
    Mal sehen, ob ich bei Deinem Code so was entdecke.
    ====
    OK.
    Zwsei neue Button auf die Form: btnStart und btnStop
    und dann ersetzt Du Deinen gesamten Code durch dies hier:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Public Class Form1
    4. Private stream As NetworkStream
    5. Private streamw As StreamWriter
    6. Private streamr As StreamReader
    7. Private client As TcpClient
    8. Private DoBreak As Boolean
    9. Private t As New Threading.Thread(AddressOf Listen)
    10. Private Delegate Sub DAddItem(ByVal s As String)
    11. Private Sub Listen()
    12. While client.Connected AndAlso Not DoBreak
    13. Try
    14. 'TextBox1.Text = streamr.ReadLine
    15. Console.WriteLine(streamr.ReadLine)
    16. Catch
    17. MessageBox.Show("3_Verbindung zum Server nicht möglich!")
    18. End Try
    19. End While
    20. DoBreak = False
    21. End Sub
    22. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    23. streamw.WriteLine("41_alive")
    24. streamw.Flush()
    25. End Sub
    26. Private Sub Button3a_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3a.Click
    27. streamw.WriteLine("41_data")
    28. streamw.Flush()
    29. End Sub
    30. Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
    31. Try
    32. DoBreak = False
    33. client = New TcpClient
    34. client.Connect("10.0.0.41", 55041) ' hier die ip des servers eintragen.
    35. If client.Connected Then
    36. stream = client.GetStream
    37. streamw = New StreamWriter(stream)
    38. streamr = New StreamReader(stream)
    39. t.Start()
    40. Else
    41. MessageBox.Show("1_Verbindung zum Server nicht möglich!")
    42. End If
    43. Catch ex As Exception
    44. MessageBox.Show("2_Verbindung zum Server nicht möglich!")
    45. End Try
    46. End Sub
    47. Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click
    48. DoBreak = True
    49. ' dem Thread Zeit geben, sich selbst zu beenden
    50. Threading.Thread.Sleep(100)
    51. If client IsNot Nothing AndAlso client.Connected Then
    52. client.Close()
    53. End If
    54. If client IsNot Nothing Then
    55. client = Nothing
    56. End If
    57. End Sub
    58. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

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

    Hallo RodFromGermany,

    vielen Dank für deinen VB-Code!
    Habe ich natürlich gleich getestet.
    Wenn ich in der Sub Listen deinen Originalcode: Console.WriteLine(streamr.ReadLine)
    verwende geht`s - obwohl ich in der Console keine Ausgabe sehe.
    Wenn ich jedoch versuche die Ausgabe in der Windows-Form TextBox zu machen gibt`die Fehlermeldung
    der Sub Listen (MessageBox.Show("3_Verbindung zum Server nicht möglich!")).

    Bitte erkläre mir dieses Phänomen.

    Danke.

    Schöne Grüße,

    MontaNus1309

    MontaNus1309 schrieb:

    VB.NET-Quellcode

    1. Console.WriteLine(streamr.ReadLine)
    Ich habe das Befüllen der TextBox ersetzt, da Du dort eine IllegalCross...Exception bekommen würdest.
    Probierma Debug.WriteLine(...)
    Die Ausgabe geht im Studio in das Ausgabe-Fenster.
    Dann mach mal ne qualifizierte Exception-Ausgabe, wo Dir gesagt wird, was da nicht funktioniert, werte das Argument (ex As Exception) aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @MontaNus1309 Dann setz den Wert auf True, wie er per default steht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!