2 Stimmen

Socket sendet eine Liste von Kunden

Ich bin nicht sehr geschickt in C#, aber ich benutze es für eine Hausarbeit. Ich habe eine Funktion erstellt, die eine Liste von Clients, die mit einem Server verbunden sind, an die anderen Clients sendet

private void SendListToClients()
    {
        Socket userSocket=null;
        string username = null;
        string role = null;
        foreach (User Users in UserList)
        {
            userSocket = Users.getSocket();
            username = Users.getUsername();
            role = Users.getRole();
            userSocket.Send(Encoding.ASCII.GetBytes("!ListStart\n"));
            for(int i=0;i<UserList.Count;i++)
            {
                User UsersControl = (User)UserList[i];
                string roleU = UsersControl.getRole();
                string usernameU = UsersControl.getUsername();

                userSocket.Send(Encoding.ASCII.GetBytes("!ClientList:"+usernameU + ":" + roleU+"\n"));       
            }

        }
    }

Mein Problem ist in der Zeile userSocket.Send(), wenn ich dies auf der Client-Seite erhalte ich nicht erhalten (wenn der Benutzer in der Liste sind 5 zum Beispiel) 5 senden, aber 1 senden mit allen 5 Benutzern. Wie kann ich das lösen? Gibt es sonst eine Möglichkeit, mein Objekt (UserList) wirklich über den Socket zu senden?

1voto

Von der Socket.Receive Methode Dokumentation:

Wenn Sie ein verbindungsorientiertes Socket verwenden, wird der Receive so viele Daten lesen, wie verfügbar sind, bis hin zur Größe des Puffers.

Obwohl der Server fünf Nachrichten nacheinander sendete, wurden sie alle im Eingabepuffer des Clients gespeichert und auf einmal gelesen.

0voto

selbie Punkte 90407

Was Sie sehen, ist Absicht. So funktioniert TCP. Oder wie andere Ihnen sagen werden: "TCP ist ein Stromprotokoll, kein Nachrichtenprotokoll".

Kurze Zusammenfassung: Nur weil Sie N Bytes "gesendet" haben, heißt das nicht, dass Sie auch N Bytes "empfangen". TCP streamt die Bytes unabhängig davon, wie die App ihre "Sende"-Aufrufe strukturiert hat. Ihr Code auf der Empfangsseite sollte darauf vorbereitet sein, Byte-Blöcke unterschiedlicher Größe zu empfangen und nicht unbedingt in Blöcken, die der Nachrichtengröße Ihrer Anwendung entsprechen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X