Asynchroner Multi Client Server, wie entferne ich clients richtig?

  • VB.NET

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

    Asynchroner Multi Client Server, wie entferne ich clients richtig?

    Hallo Leute :)
    Ich probiere einen zuverlässigen stabilen Multi Client Server zu bauen allerdings harkt es an einer stelle. Durch das Socket ordentlich die listview id abrufen und so ein Client entfernen. Der Source code den ich poste funktioniert allerdings bin ich mit einer stelle ganz und gar nicht zufrieden diese habe ich markiert.


    Wäre toll wenn ihr mir helfen könntet

    Source code :

    VB.NET-Quellcode

    1. Dim serverSocket As Socket
    2. Dim clientSocket As Socket
    3. Dim byteData(1023) As Byte
    4. ''
    5. '' Custom Functions
    6. ''
    7. Private Sub refreshClient(ByVal client As Socket)
    8. Send("|getinfo|", client)
    9. End Sub
    10. ''
    11. '' Custom Functions end
    12. ''
    13. Private Sub beginAccept()
    14. serverSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
    15. Dim IpEndPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 33724)
    16. serverSocket.Bind(IpEndPoint)
    17. serverSocket.Listen(5)
    18. serverSocket.BeginAccept(New AsyncCallback(AddressOf OnAccept), Nothing)
    19. End Sub
    20. Private Sub OnAccept(ByVal ar As IAsyncResult)
    21. clientSocket = serverSocket.EndAccept(ar)
    22. serverSocket.BeginAccept(New AsyncCallback(AddressOf OnAccept), Nothing)
    23. clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, _
    24. New AsyncCallback(AddressOf OnRecieve), clientSocket)
    25. AddClient(clientSocket)
    26. End Sub
    27. Delegate Sub _AddClient(ByVal client As Socket)
    28. Private Sub AddClient(ByVal client As Socket)
    29. If InvokeRequired Then
    30. Invoke(New _AddClient(AddressOf AddClient), client)
    31. Exit Sub
    32. End If
    33. '' IP Splitten
    34. Dim clientIP() As String = client.LocalEndPoint.ToString.Split(":")
    35. '' Items definieren
    36. Dim items(2) As String
    37. items(0) = clientIP(0)
    38. items(1) = "loading"
    39. items(2) = clientIP(1)
    40. Dim lvi As New ListViewItem(items)
    41. lvi.Tag = client
    42. lv_clients.Items.Add(lvi)
    43. End Sub
    44. Private Sub Send(ByVal msg As String, ByVal client As Socket)
    45. Try
    46. Dim sendBytes As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(msg)
    47. client.BeginSend(sendBytes, 0, sendBytes.Length, SocketFlags.None, New AsyncCallback(AddressOf OnSend), client)
    48. Catch ex As Exception
    49. lv_clients.SelectedItems(0).Remove()
    50. End Try
    51. End Sub
    52. Private Sub OnSend(ByVal ar As IAsyncResult)
    53. Dim client As Socket = ar.AsyncState
    54. client.EndSend(ar)
    55. End Sub
    56. Delegate Sub _OnRecieve(ByVal ar As IAsyncResult)
    57. Private Sub OnRecieve(ByVal ar As IAsyncResult)
    58. If InvokeRequired Then
    59. Invoke(New _OnRecieve(AddressOf OnRecieve), ar)
    60. Exit Sub
    61. End If
    62. Dim client As Socket = ar.AsyncState
    63. Try
    64. client.EndReceive(ar)
    65. Dim bytesRec As Byte() = byteData
    66. Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytesRec)
    67. Read(message)
    68. clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, _
    69. New AsyncCallback(AddressOf OnRecieve), clientSocket)
    70. Catch ex As Exception
    71. '' HIER
    72. ' An dieser stelle harkt es
    73. ' Ich kriegs nicht hin ohne eine For schleife die alle einträge prüft
    74. ''' HIER
    75. Dim activeSocket As Socket
    76. For i As Integer = 0 To lv_clients.Items.Count - 1
    77. activeSocket = lv_clients.Items(i).Tag
    78. If activeSocket.Handle = client.Handle Then
    79. lv_clients.Items(i).Remove()
    80. End If
    81. Next
    82. '' bis hier
    83. End Try
    84. End Sub
    85. Delegate Sub _Read(ByVal msg As String)
    86. Private Sub Read(ByVal msg As String)
    87. If InvokeRequired Then
    88. Invoke(New _Read(AddressOf Read), msg)
    89. Exit Sub
    90. End If
    91. Dim cmd() As String = msg.Split("|")
    92. Select Case cmd(1)
    93. Case "info"
    94. '' Empfange benutzerinfos
    95. MsgBox(cmd(2))
    96. End Select
    97. End Sub
    98. ''
    99. '' Client / Server Section ends
    100. ''
    101. End Class



    PS : Wenn ich den Beitrag mit Chrome abschicke macht er keine absätze

    Nudelkuchen schrieb:

    PS : Wenn ich den Beitrag mit Chrome abschicke macht er keine absätze

    ich denke ja, es liegt nicht an Chrome, sondern dass du den falschen Editor der Forum-Software benutzst.
    Bitte VB-Tag benutzen - aber richtig

    Kannst du mal ein Screenshot anhengen, wie diesen hier (wie das geht, gugge Anleitung DateiAnhänge)?
    Bilder
    • Shots07.Png

      72,12 kB, 848×621, 124 mal angesehen
    naja - das Problem liegt tiefer: du trennst nicht Gui von Daten.

    Bei nem ordentlichen AnwendungsDesign hätte man Datensätze, und eine Liste von Datensätzen, wo man total einfach adden und removen kann.

    Aber deine "Datensätze" sind gewissermaßen die ListViewItem, und ein Teil der Daten-Properties steht in den SubItems, ein anderer Teil (der Socket) ist mittels Tag drangepatcht.

    Da ist die Such-Schleife doch nichtmal verkehrt, wenn man so verfahren will.

    Du kannst auch spasseshalber mal VersuchsChat angugge - da gibts im Server-Objekt eine List(Of Client).

    Allerdings das Server-Form zeigt diese Clients nicht an (was prinzipiell kein Problem wäre)