Hilfe bei TCP-Server

  • VB.NET

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

    Hilfe bei TCP-Server

    Hallo,
    ich bräuchte etwas Hilfe..
    Ich möchte einen TCP-Server programmieren der entweder das Empfangene Telegramm wieder an den Client zurücksendet oder mit einem Telegramm antwortet, dass über Eingabelemente definiert wird.
    Ich habe mir etwas zusammengezimmert, das eine Clientanfrage annimmt und die gesendeten Daten liest.

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. tcpBg = New System.ComponentModel.BackgroundWorker
    3. 'Requires a routine that cancels background worker.
    4. tcpBg.WorkerSupportsCancellation = True
    5. 'ip is most likely from a Textbox.
    6. 'Dim adr As Net.IPAddress = Net.IPAddress.Parse("192.168.178.88")
    7. listener = New TcpListener(IPAddress.Any, 3333)
    8. tcpBg.RunWorkerAsync()
    9. End Sub
    10. Private Sub tcpBg_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles tcpBg.DoWork
    11. listener.Start()
    12. Dim myNetworkStream As NetworkStream
    13. SetTextBoxWithInvoke(TextBox1, "wait")
    14. ' TextBox1.Text = "wait"
    15. While tcpBg.CancellationPending = False
    16. client = listener.AcceptTcpClient
    17. myNetworkStream = client.GetStream()
    18. Dim myBufferBytes(1024) As Byte
    19. myNetworkStream.Read(myBufferBytes, 0, 1024)
    20. SetTextBoxWithInvoke(TextBox1, myBufferBytes(0))
    21. ' .Text = String.Format("{0:X2} {1:X2}", myBufferBytes(0), myBufferBytes(1))
    22. 'Do something with your client.
    23. client.Close()
    24. End While
    25. End Sub
    26. Private Delegate Sub SetTextBoxDelegate(ByVal TB As TextBox, ByVal txt As String)
    27. Private Sub SetTextBoxWithInvoke(ByVal TB As TextBox, ByVal txt As String)
    28. If TB.InvokeRequired Then
    29. TB.Invoke(New SetTextBoxDelegate(AddressOf SetTextBoxWithInvoke), New Object() {TB, txt})
    30. Else
    31. TB.Text = txt
    32. End If
    33. End Sub


    Ich möchte allerdings nicht jedesmal die Verbindung neu aufbauen müssen, sondern der Server soll warten bis Daten
    eintreffen, antworten und wieder warten. Hat jemand ne Idee wie ich das anstellen kann?
    Weiterhin bräuchte ich noch ne Idee wie ich die Darstellung der empfangenen Bytes am besten mache. Ich würde gerne jedes Byte
    einzeln hexadezimal darstellen. Es werden zwar nur ca. 64 Byte sein, aber 64 Textboxen sind ja auch ne Hausnummer..
    Gibt es evtl. Elemente die dafür besser geeignet sind?
    Viele Grüße

    *Topic verschoben, Code-Tag eingefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Haegar88 schrieb:

    Hat jemand ne Idee wie ich das anstellen kann?
    Ein Server wartet in einer Endlosschleife auf Anfragen.
    Clients melden sich an und wieder ab und werden vom Server bedient.
    Wenn sich der Server alle Clients merkt, kann er an alle oder einige davon Meldungen schicken.
    Sieh Dir mal Named Pipes an, da findest Du auch viele Beispiele im Netz:
    docs.microsoft.com/de-de/dotne…nterprocess-communication
    stackoverflow.com/questions/13806153/example-of-named-pipes
    csharp.hotexamples.com/de/exam…tream-class-examples.html
    Probiere alle Beispiele aus, verstehe sie und bau Dir dann eine Kombination, die Du verstehst.
    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!

    Haegar88 schrieb:

    Ich würde gerne jedes Byte einzeln hexadezimal darstellen. Es werden zwar nur ca. 64 Byte sein, aber 64 Textboxen sind ja auch ne Hausnummer.. Gibt es evtl. Elemente die dafür besser geeignet sind?
    Entweder Du fügst es dem TextBox-Text hinzu statt ihn immer zu überschreiben. Mach dazu aus TB.Text = txt -> TB.AppendText(txt). Oder Du nutzt keine TextBox, sondern eine ListBox und fügst die neuen Texte/Bytes der Liste an.
    btw: Den Delegate brauchst Du nicht.

    VB.NET-Quellcode

    1. Private Sub SetTextBoxText(TB As TextBox, txt As String)
    2. If TB.InvokeRequired Then TB.Invoke(Sub() SetTextBoxText(TB, txt)): Return
    3. TB.Text = txt
    4. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @RodFromGermany Fällt mir gerade noch auf:
    Lass den BackgroundWorker weg, das geht mit "normalen" Threads bzw. Server-Client-Klassen.
    Gib Deinem Client eine eigene Klasse, die muss initial nur mit den Verbindungsdaten gefüttert werden und sendet dann auf Anforderung.
    Und:
    Wenn Du die Verbindung nach dem Senden schließt, kannst Du keine Nachrichten vom Server empfangen.
    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!