Benutzer von einem Multiserver komplett entfernen

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

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

    Benutzer von einem Multiserver komplett entfernen

    Servus liebe vb-Community.

    Ich habe aufbauend auf einem Multiserver Tutorial in diesem Forum einen eigenen Multiserver geschrieben bzw. das Grundgerüst erweitert. Er verfügt über Benutzer, eine Passwortabfrage, einen Dateistream u.s.w.
    Bis jetzt lief alles Super nur folgendes Problem kann ich nicht lösen.

    Um alle Benutzer die im Server eingeloggt sind anzuzeigen habe ich folgende Funktion geschrieben:

    VB.NET-Quellcode

    1. Public Function users() As String
    2. Dim users_online As String = ""
    3. For Each con In list
    4. If (users_online = "" Or users_online = " ") Then
    5. users_online = con.nick
    6. Else
    7. users_online = users_online + ", " + con.nick
    8. End If
    9. Next
    10. Return users_online
    11. End Function




    Diese zeigt mir perfekt an welche User in meiner liste vorhanden sind.

    VB.NET-Quellcode

    1. Public list As New List(Of Connection)



    Das Problem ist nun das mir auch User angezeigt werden die sich schon Ausgeloggt haben. Daraufhin habe ich nachdem verlassen des users "list.remove(con)" eingefügt um die Verbindung zu löschen. Das funktioniert aber nicht.


    VB.NET-Quellcode

    1. Catch ex As System.Net.Sockets.SocketException
    2. Console.WriteLine(con.nick & " hat den Channel verlassen.")
    3. My.Computer.FileSystem.WriteAllText(FilePath, con.nick & " hat den Channel verlassen" + vbNewLine, True)
    4. SendToAllClients(con.nick & " hat den Channel verlassen")
    5. con.u = False
    6. SendToAllClients(con.u)
    7. con.uploadname = "."
    8. SendToAllClients(con.uploadname)
    9. list.Remove(con)



    Die Verbindung bleibt trotzdem in der Liste und wenn ich mich mehrmals ein und wieder auslogge sehe ich sachen wie: "Die Benutzer: Max, Peter, Sabrina, Max, Max, Max sind online".


    Ich hoffe die von mir zur verfügung gestellten Informationen sind ausreichend, ich bedanke mich jetzt schon für jegliche Art von Hilfe.
    Nun, ich denke die Frage sollte lauten: Wie hast du Connection implementiert? Insbesondere ob und wie du GetHashCode() überschrieben hast.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Die Struktur Connection wurde folgendermaßen geschrieben:

    VB.NET-Quellcode

    1. Public Structure Connection
    2. Dim u As Boolean
    3. Dim uploadname As String
    4. Dim stream As NetworkStream
    5. Dim streamw As StreamWriter
    6. Dim streamr As StreamReader
    7. Dim nick As String
    8. Dim pw As String
    9. Dim key As String
    10. Dim anmeldung As Boolean
    11. End Structure



    Beim einloggen/erstellen des Account wird die Connection folgendermaßen erstellt.

    VB.NET-Quellcode

    1. Dim c As New Connection
    2. c.stream = client.GetStream
    3. c.streamr = New StreamReader(c.stream)
    4. c.streamw = New StreamWriter(c.stream)
    5. c.pw = c.streamr.ReadLine
    6. ....
    7. ....


    GetHashCode() habe ich nicht überschrieben und in meinem Code nie verwendet. Was das mit der list zu tun hat weiß ich auch nicht. In mehreren Foren im Internet wie auch hier wurde zum entfernen immer die list.remove(con) Methode verwendet. Etwas anderes kenne ich gar nicht..

    max.theiner. schrieb:

    GetHashCode() habe ich nicht überschrieben und in meinem Code nie verwendet. Was das mit der list zu tun hat weiß ich auch nicht.
    Das kann ich dir sagen. GetHashCode() und Equals() sind grundlegende Funktionen mit deren Hilfe das Dotnet-Framework an verschiedensten Stellen prüft, ob zwei gegebene Objekte identisch sind.

    Zu deinem Problem schau mal in die Online-Hilfe zu List.Remove():
    Diese Methode ruft Object.Equals für die Gleichheitsprüfung auf.

    Also schauen wir was man zu Object.Equals findet:
    Die Standardimplementierung von Equals unterstützt Verweisgleichheit für Referenztypen und bitweise Gleichheit für Werttypen. Verweisgleichheit ist gegeben, wenn die zu vergleichenden Objektverweise auf dasselbe Objekt verweisen.Bitweise Gleichheit ist gegeben, wenn die binären Darstellungen der zu vergleichenden Objekte identisch sind.

    Und da haben wir dein Problem.

    Deine "Connection" ist eine Structure, und damit kein Verweis- sondern ein Referenztyp Werttyp. Bei Werttypen ist Gleichheit nur bei bitweiser Identität gegeben. Wenn du aber dein Connection-Objekt mit Nickname in die Liste schreibst und dann irgendwann den NIcknamen änderst oder rauswirfst , bevor du es mit Remove() aus der Liste kicken willst, findet er es nicht mehr. Das gleiche gilt auch für die anderen Member der Struktur - nicht nur Nickname.

    Ich denke, dein Problem wird sich auf die Schnelle ganz leicht lösen lassen, indem du aus Connection eine Klasse machst. Das geht ganz einfach, du musst nur "Structure" durch "Class" ersetzen. Naja, und ggf. aus den ganzen "Dim"s "Public"s oder "Friend"s machen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.