Autor Beitrag
s!lenCe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24
Erhaltene Danke: 1



BeitragVerfasst: Do 07.02.08 22:01 
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:

ausblenden volle Höhe Delphi-Quelltext
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:
//Wenn '0x1', dann ist jemand dem Chatraum beigetreten
  IF (msg[1] = '0'AND (msg[2] = 'x'AND (msg[3] = '1')
    THEN BEGIN
           size := Length(msg);
           //Namen herausfiltern,
           FOR i:=4 TO size DO
           BEGIN
             nick := nick + msg[i];
           END;
           //Einen Eintrag in das Logfeld schreiben
           lbxLog.Items.Add(nick + ' hat den Chatraum betreten.');
           //Und den Nickname zur Userlist hinzufügen, sofern
           //er nicht vorhanden ist
           gefunden := lbxUsers.Items.IndexOf(nick);
           IF gefunden = -1
             THEN lbxUsers.Items.Add(nick);
           Sleep(500);
           //Dann allen Clients mit '0x2' bescheid sagen, dass
           //ein neuer User dem Chat beigetreten ist
           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;
           //Dann Client für Client die Userliste schicken
           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
ausblenden Delphi-Quelltext
1:
'0x1SeinNick'					


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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
//Wenn '0x1', dann ist jemand dem Chatraum beigetreten
  //in diesem Fall soll dieser zur Userlist hinzugefügt werden
  IF (msg[1] = '0'AND (msg[2] = 'x'AND (msg[3] = '1')
    THEN BEGIN
           size := Length(msg);
           //Namen herausfiltern
           FOR i:=4 TO size DO
           BEGIN
             nick := nick + msg[i];
           END;
           //Überprüfen, ob der Nick "mein" eigener ist
           IF nick <> edtNick.Text
             THEN BEGIN
                    //Wenn NICHT, dann, falls er nicht schon
                    //vorhanden ist, in die Userliste eintragen
                    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:

user defined image


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 user profile iconChristian S.: Quote- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 09.02.08 22:03 
Moin!

Vermutlich verlässt du dich zum Trennen der Datenpakete auf die Socket-Ereignisse; leider ist das in der Regel ein Fehler. :nixweiss:

Schau mal hier rein, vielleicht kommst du damit weiter. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.