Mapowanie grup i połączeń

· Funkcje

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.