In een vorige post introduceerde ik de nieuwe functie Groups op WebSocket-servers. In deze post laat ik zien hoe je WebSocket-groepen combineert met clientverbindingen om de gebruikersdata in een clientverbinding te identificeren en op te slaan.
Met de bibliotheek sgcWebSockets kun je je eigen objecten maken en koppelen aan een TsgcWSConnection-klasse, zodat je je aangepaste object altijd kunt benaderen wanneer er een nieuw bericht binnenkomt of wanneer de client de verbinding verbreekt... Nu kun je het gebruiksgemak van Groups en Custom Objects combineren om eenvoudig geavanceerde applicaties te bouwen.
Gebruikers authenticeren
De server wordt geconfigureerd om alleen geauthenticeerde gebruikersverbindingen te accepteren. Schakel daarom eerst Authentication in aan de serverzijde en configureer vervolgens het event OnAuthentication om de door de server ontvangen verbinding te authenticeren. Gebruikers worden meestal in een database opgeslagen; in dit voorbeeld zijn de gebruikers omwille van de eenvoud hardcoded.
Server.Authentication.Enabled := True; Server.Authentication.Basic.Enabled := True;
Hieronder vind je een codevoorbeeld: controleer eerst of de gebruiker/wachtwoord bekend zijn; zijn ze correct, maak dan een nieuwe instantie van de klasse TsgcUser waarin de gebruikersdata wordt opgeslagen, vul de properties en wijs deze toe aan de property Connection.Data. Zo heb je toegang tot de gebruikersdata wanneer je een bericht van deze gebruiker ontvangt, wanneer hij of zij de verbinding verbreekt...
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;
Zodra de gebruiker is geauthenticeerd, wordt het event OnConnect geactiveerd; hier kun je de gebruiker aan een groep toevoegen. In deze demo wordt de property Department van de gebruiker gebruikt als groepsnaam. Je kunt een verbinding aan meer dan 1 groep toevoegen door de methode Groups.Add zo vaak aan te roepen als nodig.
procedure OnServerConnect(Connection: TsgcWSConnection); begin Server.Groups.Add(TsgcUser(Connection.Data).Department, Connection); end;
Wanneer de client de verbinding verbreekt, wordt de verbindingsklasse automatisch uit de Groups-property verwijderd; je hoeft dus niet handmatig te verwijderen omdat het automatisch gebeurt.
Events gebruiken
De Groups-property heeft 2 events om te melden wanneer er een gebruiker aan een groep is toegevoegd of wanneer er een uit een groep is verwijderd
OnClientAdded: wanneer er een nieuwe verbinding aan een groep is toegevoegd.
OnClientRemoved: wanneer er een bestaande verbinding uit een groep is verwijderd.
Je kunt deze events configureren voordat de server wordt gestart. In het volgende voorbeeld sturen we een bericht naar alle leden van de groep dat er een nieuw lid is toegevoegd of een bestaand lid de verbinding heeft verbroken.
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;
Berichten versturen
Je kunt de groepen gebruiken om berichten te broadcasten naar specifieke groepen, naar meerdere groepen... hieronder vind je enkele voorbeelden.
// 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.');
Hieronder vind je de broncode van de server- en clientapplicatie en de gecompileerde binaries voor Windows.
