He Jo,
Ja ich versteh das schon aber die Demo macht ja noch nicht das was ich erreichen möchte. Nämlich erstens : Den Chatverlauf in einer DB, in unterschiedlichen Tabellen speichern. Und zweitens : Ein Client kann sich nicht aussuchen von welchen anderen Clients er Nachrichten empfangen will. Bzw. welche bei ihm ankommen. Wenn ich das nach meinen Wünschen modifizieren könnte müsste ich nicht fragen.
Bei einem Chat per Websocket läuft alles über den Sever. Dem wird eine eindeutige Kennung mitgegeben, welcher Client sich da verbindet. Dieser Kennung, nennen wir sie Session-ID (SID) ist gleichermaßen ein Nickname zugeordnet.
Jede Nachricht schickt die eigene Kennung mit und ggf. eine Kennung desjenigen Clients, für den die Nachricht bestimmt ist. Hier mal einen Auszug vom CODE aufm Server:
utf8 => sub {
my ($conn, $msg) = @_;
my $msgobj = from_json($msg); # Nachricht auspacken
# für Random Access
my $sid = $msgobj->{sid};
my $nickname = $msgobj->{nickname};
$JOINS{$sid} = $nickname if $nickname && $sid;
my @joined = grep {length $_} sort values %JOINS;
my $diamond = pack "UUU", 0x20,0x25C6,0x20;
# Anwesenheitsliste
$msgobj->{joined} = join $diamond, map{ents($_)} @joined;
# Zeitstempel einfügen
$msgobj->{time} = strftime("%X", localtime);
$msg = to_json($msgobj);
# Private Nachricht nur an bestimmte SID
if(my $tosid = $msgobj->{tosid}){
for ($conn->server->connections){
next if $_->{SID} ne $tosid;
$_->send_utf8($msg);
}
}
else{
# Broadcast
$_->send_utf8($msg) for $conn->server->connections;
}
# Hier kann die Log-DB beschrieben werden
# oder Ausgabe in die Console
#print Dumper $msg;
},
Jede Chat-Nachricht enthält die eigene SID, Nickname und die Nachricht selbst als JSON Sequenz verpackt. Aufm Server wirds ausgepackt damit der Zeitstempel hinzugefügt werden kann. Und es wird geschaut, ob die Nachricht nur an eine bestimmte SID gehen soll. Außerdem wird die Anwesenheitsliste hinzugefügt und dann wird alles wieder als JSON eingepackt und zurückgeschickt: Entweder an alle Clients (Broadcast) oder nur an einen bestimmten Client.
Guck Dir mal das JS im Life Chat an (der loggt nicht). So kompliziert ist das garnicht.
.pl