Hallo allerseits!
Also ich habe ein kleines Chatprogramm in Delphi geschrieben.
Ich habe dazu die ClientSocket und die ServerSocket Komponenten
benutzt. Der Chat an sich funktionier wunderbar, nur hab ich jetzt
auch eine Userliste hinzugefügt, damit man sehen kann wer gerade alles
im Chatraum ist. Damit jeder diese Liste erhält starte ich jedesmal, wenn
jemand dem Chatraum beigetreten ist eine Schleife, mit der der Server
an alle Client die Inhalte eine Listbox (die alle User enthält) sendet.
Der Code im Server sieht so aus:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| IF (msg[1] = '0') AND (msg[2] = 'x') AND (msg[3] = '1') THEN BEGIN size := Length(msg); FOR i:=4 TO size DO BEGIN nick := nick + msg[i]; END; lbxLog.Items.Add(nick + ' hat den Chatraum betreten.'); gefunden := lbxUsers.Items.IndexOf(nick); IF gefunden = -1 THEN lbxUsers.Items.Add(nick); Sleep(500); FOR i:=0 TO ssServer.Socket.ActiveConnections-1 DO BEGIN ssServer.Socket.Connections[i].SendText('0x2' + nick); mmSende.Lines.Add('Sende: 0x2' + nick); Sleep(50); END; FOR i:=0 TO ssServer.Socket.ActiveConnections-1 DO BEGIN FOR j:=0 TO lbxUsers.Count-1 DO BEGIN ssServer.Socket.Connections[i].SendText('0x1' + lbxUsers.Items.Strings[j]); mmSende.Lines.Add('Sende: 0x1' + lbxUsers.Items.Strings[j]); Sleep(50); END; END; nick := ''; END |
Also kurze Erklärung:
Wenn ein Client sich zum Server verbunden hat, dann sendet er erstmal folgenden Text
Delphi-Quelltext
Dann wertet der Server dies aus und springt dann im OnRead Ereignis des Sockets in obigen Code. Dann wie man oben auch an den Kommentaren sieht, sendet er dann am Schluss der Funktion die Userliste.
Dann empfängt der Client die Liste und wertet sie mit folgenden Code aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| IF (msg[1] = '0') AND (msg[2] = 'x') AND (msg[3] = '1') THEN BEGIN size := Length(msg); FOR i:=4 TO size DO BEGIN nick := nick + msg[i]; END; IF nick <> edtNick.Text THEN BEGIN IF lbxUsers.Items.IndexOf(nick) = -1 THEN lbxUsers.Items.Add(nick); Sleep(50); END; nick := ''; END |
Soweit so gut. Wenn ich dies Lokal teste, funktioniert alles einwandfrei. Der Client
holt sich schön die Userliste und trägt alle User in die Listbox ein (auch bei mehreren Benutzern, alles kein Problem). Doch wenn ich dann den Clienten an einen Freund schicke
und er sich mit meinem Server verbindet bekommt er diese tolle Userliste:
Ich weiß einfach nicht woran es liegt, da wenn ich es lokal ausführe und teste,
funktioniert es einwand frei. Ich hoffe ihr könnt mir da weiterhelfen.
MfG silenCe
Moderiert von
Christian S.: Quote- durch Delphi-Tags ersetzt