TCPListener, multiple Verbindungen

  • VB.NET

    TCPListener, multiple Verbindungen

    Hallöchen,

    ich bastel nun schon länger an einer kleinen Kommandozeilenanwendung, die via TCPListener Daten annimmt. Die bisherigen Varianten, die ich verwendet habe, waren nicht in der Lage, multiple Verbindungen anzunehmen.

    Ich bin mir nicht sicher, ob es mehr Sinn macht, die Daten einfach nacheinander entgegenzunehmen und nach jedem Datenpaket einfach die Verbindung zu beenden, so dass der nächste Client connecten kann oder ob man es einfach per einem in diesem Forum bereits zitierten "Multiserver" machen sollte.

    Ich habe (Quelle: yaldex.com/vb-net-tutorial/LiB0045.html) folgenden Code gefunden:

    VB.NET-Quellcode

    1. Imports System.Net
    2. Imports System.Net.Sockets
    3. Imports System.IO
    4. Imports System.Threading
    5. Module TcpClientConsole
    6. Private Stream As NetworkStream
    7. Public Sub Main()
    8. Dim Client As New TcpClient()
    9. Try
    10. ' Try to connect to the server on port 11000.
    11. Client.Connect(IPAddress.Parse("127.0.0.1"), 11000)
    12. Console.WriteLine("* TCP Client *")
    13. Console.WriteLine("Connection established.")
    14. Console.WriteLine(New String("-", 40))
    15. Console.WriteLine()
    16. ' Retrieve the network stream.
    17. Stream = Client.GetStream()
    18. ' Create a new thread for receiving incoming messages.
    19. Dim ReceiveThread As New Thread(AddressOf ReceiveData)
    20. ReceiveThread.IsBackground =
    21. True ReceiveThread.Start()
    22. ' Create a BinaryWriter for writing to the stream.
    23. Dim w As New BinaryWriter(Stream)
    24. ' Loop until the word QUIT is entered.
    25. Dim Text As String
    26. Do
    27. Text = Console.ReadLine()
    28. ' Send the text to the remote client.
    29. If Text <> "QUIT" Then w.Write(Text)
    30. Loop Until Text = "QUIT"
    31. ' Close the connection socket.
    32. Client.Close()
    33. Catch Err As Exception
    34. Console.WriteLine(Err.ToString())
    35. End Try
    36. End Sub
    37. Private Sub ReceiveData()
    38. ' Create a BinaryReader for the stream.
    39. Dim r As New BinaryReader(Stream)
    40. Do
    41. ' Display any received text.
    42. Try
    43. If Stream.DataAvailable Then
    44. Console.WriteLine(("*** RECEIVED: " + r.ReadString()))
    45. End If
    46. Catch Err As Exception
    47. Console.WriteLine(Err.ToString())
    48. End Try
    49. Loop
    50. End Sub
    51. End Module



    Am Ende der Seite wird die Information angefügt, dass man mittels folgendem Code den "Server" Multiverbindungsfähig machen könne:


    VB.NET-Quellcode

    1. Dim Listener As New TcpListener(11000)
    2. Dim Client As TcpClient
    3. ' Initialize the port and start listening.
    4. Listener.Start()
    5. Do
    6. ' Wait for a connection request
    7. ' and return a TcpClient initialized for communication.
    8. Client = Listener.AcceptTcpClient()
    9. ' Create a new object to handle this connection.
    10. Dim Handler As New MyTcpClientHandler(Client)
    11. ' Start this object working on another thread.
    12. Dim HandlerThread As New Thread(AddressOf Handler.Process())
    13. HandlerThread.Start()
    14. Loop
    15. ' Close the underlying socket (stop listening for new requests).
    16. Listener.Stop()

    Leider ist mir etwas unschlüssig, wie man in diesem Falle beides ineinander bringen könnte / sollte, denn ich bin in Sachen Threading leider noch etwas unbewandert. Ich versuche zwar, fit darin zu werden, aber dank grossem Zeitmangel kann ich mich - zumindest zur Zeit, nur sporadisch damit beschäftigen.

    Ich würde mich freuen, wenn der ein oder andere mir einen Tip geben könnte, wie ich beide Codes miteinander verschmelzen lassen könnte.

    Viele Grüße,

    ein in der Hecke pennender Penner ;)