In einem früheren Beitrag habe ich die neue Funktion Gruppen auf WebSocket-Servern vorgestellt. In diesem Beitrag zeige ich, wie sich die WebSocket-Gruppen mit den Client-Verbindungen kombinieren lassen, um Nutzerdaten in einer Client-Verbindung zu identifizieren und zu speichern.
Die sgcWebSockets-Bibliothek erlaubt es dir, eigene Objekte zu erstellen und sie mit einer TsgcWSConnection-Klasse zu verknüpfen, sodass du jederzeit auf dein benutzerdefiniertes Objekt zugreifen kannst – wenn eine neue Nachricht eintrifft, wenn der Client die Verbindung trennt usw. Jetzt kannst du die Einfachheit der Gruppen mit den Custom Objects kombinieren, um fortgeschrittene Anwendungen leicht zu bauen.
Nutzer authentifizieren
Der Server wird so konfiguriert, dass er nur authentifizierte Nutzerverbindungen akzeptiert. Aktiviere also zunächst die Authentifizierung auf Serverseite und konfiguriere dann das Ereignis OnAuthentication, um die vom Server empfangene Verbindung zu authentifizieren. Die Nutzer werden normalerweise in einer Datenbank gespeichert; in diesem Beispiel sind sie der Einfachheit halber hartcodiert.
Server.Authentication.Enabled := True; Server.Authentication.Basic.Enabled := True;
Unten findest du Beispielcode. Zuerst wird geprüft, ob Nutzer/Passwort bekannt sind; sind sie korrekt, wird eine neue Instanz der Klasse TsgcUser erstellt, in der die Nutzerdaten gespeichert werden, die Eigenschaften werden gefüllt und der Connection.Data-Eigenschaft zugewiesen. So kannst du auf die Nutzerdaten zugreifen, wenn du eine Nachricht von diesem Nutzer empfängst, wenn er sich abmeldet ...
type
TsgcUser = class
private
FAge: Integer;
FDepartment: string;
FPhone: string;
FUsername: string;
public
property Username: string read FUsername write FUsername;
property Department: string read FDepartment write FDepartment;
property Phone: string read FPhone write FPhone;
property Age: Integer read FAge write FAge;
end;
procedure OnServerAuthentication(Connection: TsgcWSConnection; aUser,
aPassword: string; var Authenticated: Boolean);
var
oUser: TsgcUser;
begin
if (aUser = 'user-1') and (aPassword = 'password-1') then
begin
Authenticated := True;
oUser := TsgcUser.Create;
oUser.Username := 'Mark';
oUser.Phone := '+55431588744134';
oUser.Department := 'Sales';
oUser.Age := 22;
Connection.Data := oUser;
end
else
Authenticated := False;
end;
Sobald der Nutzer authentifiziert ist, wird das Ereignis OnConnect ausgelöst; hier kannst du den Nutzer einer Gruppe hinzufügen. In dieser Demo wird die Eigenschaft Department des Nutzers als Gruppenname verwendet. Du kannst eine Verbindung mehr als einer Gruppe zuordnen – rufe einfach die Methode Groups.Add so oft auf, wie du brauchst.
procedure OnServerConnect(Connection: TsgcWSConnection); begin Server.Groups.Add(TsgcUser(Connection.Data).Department, Connection); end;
Wenn der Client die Verbindung trennt, wird die Verbindungsklasse automatisch aus der Groups-Eigenschaft entfernt; ein manuelles Entfernen ist nicht nötig, da dies automatisch geschieht.
Ereignisse verwenden
Die Groups-Eigenschaft besitzt 2 Ereignisse, die jedes Mal benachrichtigen, wenn ein Nutzer einer Gruppe hinzugefügt oder daraus entfernt wurde
OnClientAdded: wenn eine neue Verbindung einer Gruppe hinzugefügt wurde.
OnClientRemoved: wenn eine bestehende Verbindung aus einer Gruppe entfernt wurde.
Du kannst diese Ereignisse vor dem Start des Servers konfigurieren. Im folgenden Beispiel senden wir an alle Gruppenmitglieder eine Nachricht, dass ein neues Mitglied hinzugekommen ist oder ein bestehendes Mitglied die Verbindung getrennt hat.
Server.Groups.OnClientAdded := OnClientAddedEvent;
Server.Groups.OnClientRemoved := OnClientRemovedEvent;
procedure OnClientAddedEvent(Sender: TObject; const aGroup:
TsgcWSServerGroupItem; const aConnection: TsgcWSConnection);
var
vMessage: string;
begin
vMessage := TsgcUser(aConnection.Data).Username + ' has logged in.';
aGroup.BroadCast(vMessage);
end;
procedure TForm16.OnClientRemovedEvent(Sender: TObject; const aGroup:
TsgcWSServerGroupItem; const aConnection: TsgcWSConnection);
var
vMessage: string;
begin
vMessage := TsgcUser(aConnection.Data).Username + ' has disconnected.';
aGroup.BroadCast(vMessage);
end;
Nachrichten senden
Du kannst die Gruppen verwenden, um Nachrichten an bestimmte Gruppen, an mehrere Gruppen usw. zu broadcasten ... unten findest du einige Beispiele.
// All members
Server.Groups.Broadcast('*', 'Hello All Members.');
// Only group "admin"
Server.Groups.Broadcast('admin', 'Hello Admin Members.');
// All sales groups (sales/asi, sales/europe, sales/america...)
Server.Groups.Broadcast('sales/*', 'Hello Sales Members.');
// Only group "accounting" (must exists!!!)
Server.Groups.Group['accounting'].Broadcast('Hello Accounting Members.');
Unten findest du die Quellen der Server- und Client-Anwendung sowie die kompilierten Binaries für Windows.
