W poprzednim wpisie przedstawiłem nową funkcję Grup dla serwerów WebSocket. W tym wpisie pokażę, jak połączyć grupy WebSocket z połączeniami klientów w celu identyfikowania i przechowywania danych użytkownika w połączeniu klienta.
Biblioteka sgcWebSockets pozwala na tworzenie własnych obiektów i łączenie ich z klasą TsgcWSConnection, dzięki czemu możesz w dowolnym momencie uzyskać dostęp do swojego obiektu przy odbiorze nowej wiadomości, rozłączeniu klienta itd. Teraz możesz połączyć łatwość użycia Grup i Obiektów niestandardowych, aby łatwo budować zaawansowane aplikacje.
Uwierzytelnianie użytkowników
Serwer zostanie skonfigurowany tak, aby akceptował wyłącznie uwierzytelnione połączenia. Najpierw włącz uwierzytelnianie po stronie serwera, a następnie skonfiguruj zdarzenie OnAuthentication do uwierzytelniania połączeń przychodzących. Zazwyczaj użytkownicy są przechowywani w bazie danych — w tym przykładzie są zakodowani na stałe dla uproszczenia.
Server.Authentication.Enabled := True; Server.Authentication.Basic.Enabled := True;
Poniżej znajdziesz przykładowy kod: najpierw sprawdź, czy dane użytkownika i hasło są znane; jeśli są poprawne, utwórz nową instancję klasy TsgcUser, w której przechowywane są dane użytkownika, uzupełnij właściwości i przypisz do właściwości Connection.Data. Dzięki temu możesz uzyskać dostęp do danych użytkownika przy odbiorze wiadomości, rozłączeniu itd.
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;
Po uwierzytelnieniu użytkownika zostanie wywołane zdarzenie OnConnect — tutaj możesz dodać użytkownika do grupy. W tej demonstracji właściwość Department użytkownika będzie używana jako nazwa grupy. Możesz dodać połączenie do więcej niż jednej grupy — wystarczy wywołać metodę Groups.Add tyle razy, ile potrzebujesz.
procedure OnServerConnect(Connection: TsgcWSConnection); begin Server.Groups.Add(TsgcUser(Connection.Data).Department, Connection); end;
Gdy klient się rozłącza, klasa połączenia jest automatycznie usuwana z właściwości Groups — nie ma potrzeby ręcznego usuwania, ponieważ odbywa się to automatycznie.
Korzystanie ze zdarzeń
Właściwość Groups ma 2 zdarzenia powiadamiające za każdym razem, gdy użytkownik zostanie dodany do grupy lub usunięty z niej.
OnClientAdded: wywoływane, gdy nowe połączenie zostało dodane do grupy.
OnClientRemoved: wywoływane, gdy istniejące połączenie zostało usunięte z grupy.
Możesz skonfigurować te zdarzenia przed uruchomieniem serwera. W poniższym przykładzie wysyłamy wiadomość do wszystkich członków grupy o dodaniu nowego lub rozłączeniu istniejącego członka.
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;
Wysyłanie wiadomości
Możesz używać Grup do rozsyłania wiadomości do określonych grup, do wielu grup naraz... Poniżej znajdziesz kilka przykładów.
// 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.');
Poniżej znajdziesz kody źródłowe aplikacji serwera i klienta oraz skompilowane pliki binarne dla systemu Windows.
