Threadbasierter Multiserver, wie realisiere ich das

  • VB.NET

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

    Threadbasierter Multiserver, wie realisiere ich das

    Hallo an alle,

    Ich habe folgendes Problem, ich möchte eine Anwendung (Windows Form) erstellen, die für jede Clientverbindung einen Thread erstellt, jedoch habe ich da das Problem, mit dem Anfang. der Konstruktion...

    Ich habe mir bereits Das Tutorial "MultiServer (TCP)" durchgelesen und angeschaut, das ist das was ich brauche, aber wie spreche ich da eine bestimmete verbindung an? Denn in dem Tutorial wird an alle gesendet, aber nicht wie man jetzt nur zb "User 6" einen text sendet!



    :(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MrTweek“ ()

    Ich hab mich auch mal damit befasst, aber nicht wirklich viel zeit und hab dann aufgehört...
    Vielleicht machst du dir einfach ma ne eigene Klasse "User" oder so, wo die ganzen connection datas drinne sind, vielleicht noich der name oder so,

    war vielleicht nicht wirklich viel hilfe aber schau dir doch ma irgendwo gameserver tut'S an, fals es sowas gibt, da die ja auch so funktionieren...
    Soweit habe ich es hinbekommen, habe den MUltiserver etwas abgeändert, aber es will irgendwie net, wenn jemand verbindet wird es nicht in der Listview liste angezeigt... aber per putty kommt korrekt die ausgabe des gesendeten clients als antwort vom Server...




    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Net
    3. Imports System.IO
    4. Imports System.Net.Sockets
    5. Imports System.Threading
    6. Imports System.Text
    7. Module Server
    8. Dim WithEvents Listener As TcpListener
    9. Dim Client As New TcpClientDim connections As New List(Of Connection)
    10. Dim Listener_thread As New Thread(AddressOf Listening)Dim ip As New IPEndPoint(IPAddress.Any, 2380)
    11. Public Structure Connection
    12. Dim stream As NetworkStream
    13. Dim writer As StreamWriter
    14. Dim reader As StreamReader
    15. Dim remote_ip As String
    16. Dim con_id As Integer
    17. End Structure
    18. Private Function _get_remote_ip(ByVal input As String)
    19. Dim end_of_raddress, raddress_length As Integer
    20. Dim rabsender As String
    21. end_of_raddress = InStr(1, input, ":", 1) 'position bis ";" ermitteln
    22. raddress_length = end_of_raddress - 1 ' Position des ";" abziehn
    23. rabsender = Mid(input, 1, raddress_length) 'extrahiere den AbsenderReturn rabsender
    24. End Function
    25. Public Sub Start()
    26. Try
    27. Listener_thread.Start()
    28. Catch ex As Exception
    29. End Try
    30. End Sub
    31. Private Sub ListenToConnection(ByVal con As Connection)
    32. Do
    33. Try
    34. Dim tmp As String = con.reader.ReadLine ' warten, bis etwas empfangen wird...
    35. SendToAllClients(con.con_id & "(" & con.remote_ip & "): " & tmp) ' an alle clients weitersenden.
    36. Catch ' die aktuelle überwachte verbindung hat sich wohl verabschiedet.
    37. connections.Remove(con)
    38. Exit Do
    39. End Try
    40. Loop
    41. End Sub
    42.  
    43.  Private Sub Listening()
    44. Dim c_id, c_name, c_user, c_os, c_rip, c_acthwnd, c_status As String
    45. Try
    46. Listener = New TcpListener(ip)
    47. Listener.Start()
    48. While True ' wir warten auf eine neue verbindung...
    49. Client = Listener.AcceptTcpClient
    50. Dim c As New Connection ' und erstellen für die neue verbindung eine neue connection...
    51. c.stream = Client.GetStreamc.reader = New StreamReader(c.stream)
    52. c.writer = New StreamWriter(c.stream)
    53. c.remote_ip = _get_remote_ip(Client.Client.RemoteEndPoint.ToString)
    54. c_rip = c.remote_ip
    55. c.con_id = connections.Count
    56. c_id = c.con_id.ToString
    57. c_name = "Client" & c.con_id.ToString
    58. c_user = "Unbekannt"
    59. c_status = "Unbekannt"
    60. main.Invoke(New main.delegated_Add_list_entry(AddressOf main._Add_list_entry), c_id, c_name, c_user, c.remote_ip, c_status)
    61.  
    62. connections.Add(c) ' und fügen sie der liste der clients hinzu
    63. Dim reader_thread As New Thread(AddressOf ListenToConnection)
    64. reader_thread.Start(c)
    65. End While
    66. Catch ex As Exception
    67. End Try
    68. End Sub
    69. Public Sub SendToClient(ByVal c As Connection, ByVal data As String)
    70. Try
    71. c.writer.WriteLine(data)
    72. c.writer.Flush()
    73. Catch ex As Exception
    74. End Try
    75. End SubPrivate Sub SendToAllClients(ByVal s As String)
    76. For Each c As Connection In connections ' an alle clients weitersenden.
    77. Try
    78. c.writer.WriteLine(s)
    79. c.writer.Flush()
    80. Catch
    81. End Try
    82. Next
    83. End Sub
    84. Public Sub Stop_Server()
    85. Try
    86. Listener.Stop()
    87. Client.Close()
    88. Listener_thread.Abort()
    89. Catch ex As Exception
    90. End Try
    91. End Sub
    92. End Module

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

    Hier sind meine Drei Sub's für das Senden Von Nachrichten in Folgenden Methoden:

    1. An Alle. Ist ja bereits bekannt.

    2. An Alle auser Einen bestimmten

    3. Nur an einen Bestimmten.

    VB.NET-Quellcode

    1. ' An Alle User Senden! (Nachricht = S)
    2. Private Sub SendToAllClients(ByVal s As String)
    3. For Each c As Connection In list
    4. 'An Jede Verbindung in Connection senden.
    5. Try
    6. c.streamw.WriteLine(s)
    7. c.streamw.Flush()
    8. Catch
    9. End Try
    10. Next
    11. End Sub
    12. ' An Alle User Senden Auser vom Ausgehenden! (Nachricht = s,Nick) ' Nick = User der Die Nachricht NICHT erhalten soll.
    13. Private Sub SendToAllClientsWithoutSender(ByVal s As String, ByVal NichtZu As String)
    14. For Each c As Connection In list
    15. If Not c.nick = Nick Then 'Sollte der Connection Nick nicht der Übergebene sein Sende die Nachricht an Ihn
    16. Try
    17. c.streamw.WriteLine(s)
    18. c.streamw.Flush()
    19. Catch
    20. End Try
    21. End If
    22. Next
    23. End Sub
    24. ' An einen User Senden (Nachricht= S,Nick) ' Nick = Name des Users der Die Nachricht erhalten soll.
    25. Private Sub SendtoClient(ByVal s As String, ByVal Nick As String)
    26. For Each Connection In list
    27. Try
    28. If Connection.nick = Nick Then
    29. 'Sollte der Connection Name der Gleiche wie der Übergebene sein Sende die nachricht an Ihn
    30. Connection.streamw.WriteLine(s)
    31. Connection.streamw.Flush()
    32. End If
    33. Catch
    34. End Try
    35. Next
    36. End Sub


    Diesen Code verwende ich bei meinem TCP Server Projekt.. Sollte eig alles Funktionieren mit dem TPC server aus dem TuT.

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

    Ja das senden funktioniert ja, aber es werden keine clients in der liste angezeigt, wenn einer verbindet dann ist die trotzdem leer...

    EDIT:
    Ich habe das Problem gefunden, es wurde ein Invoke benötigt :)

    VB.NET-Quellcode

    1. Private Sub Listening()
    2. Dim c_id, c_name, c_user, c_os, c_rip, c_acthwnd, c_status As String
    3. Try
    4. Listener = New TcpListener(ip)
    5. Listener.Start()
    6. While True
    7. Client = Listener.AcceptTcpClient
    8. Dim c As New Connection
    9. Dim cname As String = "Client_" & c.con_id.ToString
    10. c.stream = Client.GetStream
    11. c.reader = New StreamReader(c.stream)
    12. c.writer = New StreamWriter(c.stream)
    13. c.remote_ip = _get_remote_ip(Client.Client.RemoteEndPoint.ToString)
    14. c_rip = c.remote_ip
    15. c.con_id = connections.Count
    16. c_id = c.con_id.ToString
    17. c_name = "Client" & c.con_id.ToString
    18. c_user = "Unbekannt"
    19. c_status = "Unbekannt"
    20. If ListView.InvokeRequired Then
    21. Me.Invoke(New delegated_Add_list_entry(AddressOf _Add_list_entry), c_id, c_name)
    22. Else
    23. _Add_list_entry(c_id, c_name)
    24. End If
    25. connections.Add(c) ' und fügen sie der liste der clients hinzu
    26. Dim reader_thread As New Thread(AddressOf ListenToConnection)
    27. reader_thread.Start(c)
    28. End While
    29. Catch ex As Exception
    30. End Try
    31. End Sub

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