Moin,
Also meine Lösung ist nur eine einfachere als die von Zacherl. Weil du immer weißt womit du hantierst und nicht mit Pointern arbeitest.
Vielleicht habe ich das übersehen, aber womit überträgst du die Daten? Zum Beispiel wenn du IdTCP (oder IdUDP) nutzt dann hätte ich es so gespeichert:
Delphi-Quellcode:
type
TClientConnection =
class
private
FSocket : TIdTCP;
FNickname :
string;
function GetIP :
string;
// Hier halt die Ip mithilfe des Sockets zurückgeben oder irgendwie anders :)
public
property Socket : TIdTCP
read FSocket;
property Nickname :
string read FNickname
write FNickname;
property IP :
string read GetIP;
end;
TClientList =
class
private
FClients : TObjectList;
// Im Konstruktor erstellen & im Destruktor freigeben.
public
procedure ClientConnect(Connection : TClientConnection);
procedure ClientDisconnect(Connection : TClientConnection);
end;
Und wie du dein Protokoll schreibst, musst du wie gesagt immer selber wissen. Meine Möglichkeit hat den Vorteil, dass du sie mit einer TStringList lesen/interpretieren kannst. So könnte zum Beispiel eine private Nachricht aussehen:
Code:
PRIVATE
hans ditter
Hallo hans ditter! Dies ist eine private Nachricht
PRIVATE als Kennzeichner, dass es eine PM ist, dann der Nickname und dann der Text. Die Nachricht bekommst du dann und musst dann nur noch folgendes machen (Pseudoquelltext):
Code:
Wenn Typ = PM dann:
Suche in der Clientliste nach den Nickname
Ist der Nickname vorhanden
Schicke die PM an den Client (Empfänger)
ansonsten
Schicke eine Fehlermeldung an den Sender
Die könnte dann so aussehen:
Code:
PRIVATE-RECV
xZise
Hallo hans ditter! Dies ist eine private Nachricht
Und die Fehlermeldung z.B.:
Code:
PRIVATE-ERR
Benutzername "hans ditter" nicht im Netzwerk vorhanden!
Bei diesem System hat man den Nachteil, dass man viel Platz verschwendet, durch die Zeilenumbrüche und den sprechenden Befehlen (PRIVATE, PRIVATE-RECV und PRIVATE-ERR). Aber dafür kann jeder Administrator sehen, wenn was schief geht was schief geht (z.B. hat jemand PRIVAT statt PRIVATE stehen oder so
).
Ein anderes Format wäre im
IRC Stil:
Hier wäre der Trenner das Leerzeichen, aber wieder sprechende Befehle, und Nicknames mit Leerzeichen sind nicht möglich.
Ansonsten kannst du dir auch XMPP anschauen. Die nutzen
XML, was natürlich noch mehr Platz verschwendet. Aber dadurch ist es sehr leicht zu sehen, was verschickt wird, und das Protokoll kann einfach erweitert werden.
[redbox]Irgendwo speicherst du doch, die verschiedenen Verbindungen oder?[/redbox]
MfG
Fabian