Multiple Connections auf TCPListener via Sekundären Thread (Problem)

  • VB.NET

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

    Multiple Connections auf TCPListener via Sekundären Thread (Problem)

    Heyho, ist schon lang her das ich wieder on war... Gott das alte Design gefiel mir Besser ;)


    Aber nun hab ich ein Problem bzw.. eher eine Frage.

    Ich versuch grad mir eine kleine Chatanwendung zu basteln die am Ende Dateien Transferieren soll und Nachrichten schreiben kann(Standart halt.)

    Ich hab wenig erfahrung in TCP Sockets u.s.w - bin eher der 3D Animator... :x

    Mein bisjetziger Stand ist. Ich hab bisjetzt einen Server der auf Client/s wartet. Und eine Chatanwendung die wunderbarfunktioniert
    Nur der Server acceptiert nur ein Client danach listet er ja nicht mehr darauf.

    Der Server wird im Sekundären Thread ausgeführt damit meine Form nicht ein auf Schneemann macht.

    Sieht so aus:
    Meine Variablen

    VB.NET-Quellcode

    1. Public Shared TCPStream As NetworkStream
    2. Public Shared TCPWriter As StreamWriter
    3. Public Shared TCPReader As StreamReader
    4. Public Shared TCPServer As TcpListener
    5. Public Shared IPEndPointer As IPEndPoint
    6. Public Shared IPPort As Integer
    7. Public Shared ServerThread As Threading.Thread
    8. Public Shared LogField As TextBox
    9. Public Shared TCPClient As New TcpClient
    10. 'Public Shared TCPClients As New List(Of ConnectedClients)
    11. Public Shared ServerIP As String
    12. Public Shared ServerPort As Integer
    13. Public Shared LoginName As String
    14. Public Shared RecieverField As TextBox
    15. Delegate Sub LoggerDelegate(ByVal Target As TextBox, ByVal Text As String)


    Mein MainServer

    VB.NET-Quellcode

    1. Public Shared Sub MainServer()
    2. Try
    3. TCPServer = New TcpListener(IPEndPointer)
    4. TCPServer.Start()
    5. TCPClient = TCPServer.AcceptTcpClient
    6. TCPStream = TCPClient.GetStream
    7. TCPReader = New StreamReader(TCPStream)
    8. TCPWriter = New StreamWriter(TCPStream)
    9. 'Dim Listener As New Threading.Thread(AddressOf ClientListener)
    10. While True
    11. TCPWriter.WriteLine(TCPReader.ReadLine)
    12. TCPWriter.Flush()
    13. End While
    14. Catch ex As Exception
    15. MsgBox(ex.Message)
    16. End Try
    17. End Sub


    Nun meine Frage -> Was muss ich machen damit mehr als nur einer Connecten kann?

    Anmerkung: Das Auskommentierung war der Versuch mein Hirn zu benutzen um selbst drauf zu kommen...
    "Es gibt guten und schlechten Code und es gibt Code der einfach nur Funktionieren soll." - P. White


    www.pacrafts.de

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

    Du hast eine Server-Client Architektur, also behandle sie auch so.

    Erstelle dir eine Klasse client und gib ihr alle Funktionen mit, die sie benötigt, um ihre Aufgaben zu erledigen. Der Server fragt in einer While-Schleife TCPServer.Pending ab, um heraus zu finden, ob sich überhaupt jemand mit ihm verbinden will. Ist das Fall, wird .AcceptTcpClient aufgerufen, nicht vorher.
    Dann erstellst du ein Client Objekt, übergibst ihm den NetworkStream, und führst die Funktion aus, die für die Kommunikation zuständig ist. Kannst dir dann aussuchen, ob du das in einem Thread-Objekt machst,den Threadpool benutzt, async/await, Tasks,... So kann dann der Server mit mehr als nur einem Client sprechen.

    Achja, deine While schleife wird sich niemals beenden. Aus einem While True kommst nicht mehr heraus. Hier im Forum gibts noch Beispiele für Chatserver, die du dir ansehen kannst.
    Ok, ich hab mein Hirn nochmal angestrengt,

    Und hab das soweit bekommen:

    VB.NET-Quellcode

    1. Public Shared TCPStream As NetworkStream
    2. Public Shared TCPWriter As StreamWriter
    3. Public Shared TCPReader As StreamReader
    4. Public Shared TCPServer As TcpListener
    5. Public Shared IPEndPointer As IPEndPoint
    6. Public Shared IPPort As Integer
    7. Public Shared ServerThread As Threading.Thread
    8. Public Shared LogField As TextBox
    9. Public Shared TCPClient As New TcpClient
    10. Public Shared TCPClients As New List(Of Connection)
    11. Public Structure Connection
    12. Dim ClientStream As NetworkStream
    13. Dim ClientReader As StreamReader
    14. Dim ClientWriter As StreamWriter
    15. Dim ClientNick As String
    16. End Structure
    17. Public Shared ServerIP As String
    18. Public Shared ServerPort As Integer
    19. Public Shared LoginName As String
    20. Public Shared RecieverField As TextBox
    21. Public Shared Sub StartServerThreading(IP As String, Port As Integer)
    22. ServerIP = IP
    23. ServerPort = Int(Port)
    24. IPEndPointer = New IPEndPoint(IP, Port)
    25. ServerThread = New Threading.Thread(AddressOf MainServer)
    26. ServerThread.IsBackground = True
    27. PiConnectorClass.Logger("Server wird gestartet...")
    28. ServerThread.Start()
    29. PiConnectorClass.Logger("Server gestartet: " & ServerIP & ":" & ServerPort)
    30. End Sub
    31. Public Shared Sub MainServer()
    32. Try
    33. TCPServer = New TcpListener(IPEndPointer)
    34. TCPServer.Start()
    35. While True
    36. TCPClient = TCPServer.AcceptTcpClient
    37. Dim c As New Connection
    38. c.ClientStream = TCPClient.GetStream
    39. c.ClientReader = New StreamReader(c.ClientStream)
    40. c.ClientWriter = New StreamWriter(c.ClientStream)
    41. TCPClients.Add(c)
    42. Dim t As New Threading.Thread(AddressOf ConnectionListener)
    43. t.Start(c)
    44. End While
    45. Catch ex As Exception
    46. MsgBox(ex.Message)
    47. End Try
    48. End Sub


    Die Klasse hab ich einfach mal PiConnectorClass genannt...^^

    Mein Problem ist nun das ich nicht weiß wie ich über "Peek" in der Client anwendung eine Schleife bauen kann die Immer abfrägt ob eine neue Nachricht vorhanden ist und das Window Aktualisiert.


    So Like

    VB.NET-Quellcode

    1. Do until TCPClientReader.Peek <> -1
    2. 'was auch immer.
    3. Loop


    Nur leider kommt bei mir dann "Sobald ein Client disconnected eine art... Exception IO System.dll"

    Warum?
    "Es gibt guten und schlechten Code und es gibt Code der einfach nur Funktionieren soll." - P. White


    www.pacrafts.de