TCP Server über Thread Background

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

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    TCP Server über Thread Background

    Guten Tag Leute
    Ich habe mir per TCP Server eine Komunikation gebaut, wo ich von Meinem Handy aus daten ins Programm erhalte. Um genau zu sein kommen Barcodes in Textform an.

    ICh habe nun versucht mir eine Barcodeklasse zu schreiben inder ich dann die Verschiedenen typen beandeln möchte.

    Bei TCP habe ich aber das Problem das ich gerne Die Klasse "Öffnen/Starten" sowie "Schließen/Stoppen" möcte, um in einem anderen Fenster dann mit dem Handy zu komunizieren.
    Desalb habe ich mich auch für einen Background Thread entschieden.

    Löse ich einen Thread.abort aus, eibt jedoch alles eingefroren. Und jetzt bräuchte ich eure Hilfe. Wieso macht er das?

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.IO
    3. Imports System.Net
    4. Imports System.Threading
    5. Class Barcode_Scanner
    6. Public Event ConnWaiting()
    7. Public Event ConnSucess()
    8. Public Event ConnClosed()
    9. Public Event CodeAceppted(ByVal Codetext As String)
    10. Public Event Err(ByVal Errortext As String)
    11. Dim Trd_TCP_Server As Thread = New Thread(Sub() TCP_Server()) With {.IsBackground = True, .Name = "TCP_Server_Barcode"}
    12. Public Sub StartServer()
    13. Select Case 1
    14. Case 1
    15. Trd_TCP_Server = New Thread(Sub() TCP_Server()) With {.IsBackground = True, .Name = "TCP_Server_Barcode"}
    16. Trd_TCP_Server.Start()
    17. End Select
    18. End Sub
    19. Sub StopServer()
    20. Select Case 1
    21. Case 1
    22. If Trd_TCP_Server IsNot Nothing AndAlso Trd_TCP_Server.IsAlive Then
    23. Trd_TCP_Server.Abort()
    24. Trd_TCP_Server = Nothing
    25. RaiseEvent ConnClosed()
    26. End If
    27. End Select
    28. End Sub
    29. Sub TCP_Server()
    30. Dim server As TcpListener
    31. server = Nothing
    32. server = New TcpListener(9999)
    33. server.Start()
    34. Dim bytes(1024) As Byte
    35. Dim data As String = Nothing
    36. Try
    37. While True
    38. RaiseEvent ConnWaiting()
    39. ' Perform a blocking call to accept requests.
    40. ' You could also user server.AcceptSocket() here.
    41. Dim client As TcpClient = server.AcceptTcpClient()
    42. RaiseEvent ConnSucess()
    43. data = Nothing
    44. ' Get a stream object for reading and writing
    45. Dim stream As NetworkStream = client.GetStream()
    46. Dim i As Int32
    47. ' Loop to receive all the data sent by the client.
    48. i = stream.Read(bytes, 0, bytes.Length)
    49. While (i <> 0)
    50. ' Translate data bytes to a ASCII string.
    51. data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)
    52. RaiseEvent CodeAceppted(data)
    53. i = stream.Read(bytes, 0, bytes.Length)
    54. End While
    55. ' Shutdown and end connection
    56. client.Close()
    57. End While
    58. Catch ex As ThreadAbortException
    59. server.Stop()
    60. Catch e As SocketException
    61. RaiseEvent Err(e.Message)
    62. Finally
    63. server.Stop()
    64. RaiseEvent ConnClosed()
    65. End Try
    66. End Sub 'Main
    67. End Class
    Spekulatius:
    Zeile#12 und 18 erzeugen beiden neue Threads. Die Definition in Z#12 ist überflüssig, da reicht Dim Trd_TCP_Server As Thread = Nothing

    btw: Was soll das Select-Case-Konstrukt, wenn Du nur einen Fall hast?
    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.

    tomtombusiness schrieb:

    VB.NET-Quellcode

    1. RaiseEvent ConnWaiting()
    2. ' ...
    3. RaiseEvent CodeAceppted(data)
    Wie oft werden diese Events ausgelöst?
    Was passiert in den kommunizierenden Eventhandlern?
    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!
    ConWaiting und so sind meine Events damit ich in meiner eigendlichen Form den Status anzeige

    Und mein Select Konstrukt dente damals für verschiedene Arten der Komuniketion. Ist aber eher ein überbleibsel und wurde mal eben so angepasst
    @tomtombusiness Du hast dsas Problem nicht erfasst.

    RodFromGermany schrieb:

    Wie oft
    pro Zeiteinheit
    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!

    tomtombusiness schrieb:

    Löse ich einen Thread.abort aus, eibt jedoch alles eingefroren. Und jetzt bräuchte ich eure Hilfe. Wieso macht er das?
    Ich sehe keinen Code, wo Thread.Abort ausgelöst wird - also was soll man dazu sagen?

    Vlt. dieses: Meine Wenigkeit zum Beispiel beendet eine TcpVerbindung nicht mit Thread.Abort, sondern mit TcpClient.Dispose().
    Vielleicht liegt es an dem blockierenden TcpListener.AcceptTcpClient() und dem blockierenden Thread.Abort().
    Der Thread ist blockiert, und kann auf nichts reagieren, solange sich kein Client damit verbindet.
    Und wenn du nun Abort auf den blockierten Thread aufrufst, blockiert das Abort den "Hauptthread", da es darauf wartet, dass der andere Thread, der ja bereits blockiert ist, beendet wird.
    Kurz gesagt, du bist nicht sehr weit von einem Deadlock entfernt.

    Um das zu beheben, müsstest du zuerst nachsehen, ob es Jemanden gibt, der sich mit dir verbinden möchte, und dann die Verbindung akzeptieren.
    Wenn nicht, prüfe, ob der Thread beendet werden soll, und wenn auch nicht, warte einfach 500ms oder so und fang von Vorne an.

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