Grupları ve Bağlantıları Eşleştirme

· Özellikler

Önceki bir gönderide, WebSocket Sunucularındaki yeni Groups özelliğini tanıtmıştım. Bu gönderide, kullanıcı verilerini bir istemci bağlantısında tanımlamak ve saklamak için WebSocket Gruplarını İstemci Bağlantılarıyla nasıl birleştireceğinizi göstereceğim.

sgcWebSockets kitaplığı, kendi nesnelerinizi oluşturmanıza ve bir TsgcWSConnection sınıfına bağlamanıza olanak tanır; böylece yeni bir mesaj alındığında, istemci bağlantıyı kestiğinde... özel nesnenize istediğiniz zaman erişebilirsiniz. Artık gelişmiş uygulamaları kolayca oluşturmak için Groups'un ve Custom Objects'in kullanım kolaylığını birleştirebilirsiniz.

Kullanıcıların Kimliğini Doğrulama

Sunucu yalnızca kimliği doğrulanmış kullanıcı bağlantılarını kabul edecek şekilde yapılandırılacaktır; bu nedenle önce Sunucu tarafında Authentication'ı etkinleştirin ve ardından sunucunun aldığı bağlantının kimliğini doğrulamak için OnAuthentication olayını yapılandırın. Kullanıcılar genellikle bir veritabanında saklanır; bu örnekte basitlik için kullanıcılar sabit kodlanmıştır.

Server.Authentication.Enabled := True;
Server.Authentication.Basic.Enabled := True; 

Aşağıda örnek bir kod bulabilirsiniz; önce Kullanıcı/Parolanın bilinip bilinmediğini değerlendirin; doğruysa, kullanıcı verilerinin saklandığı TsgcUser sınıfının yeni bir örneğini oluşturun, özellikleri doldurun ve Connection.Data özelliğine atayın. Bu sayede, bu kullanıcıdan bir mesaj aldığınızda, bağlantı kesildiğinde... kullanıcı verilerine erişebilirsiniz. 

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; 

Kullanıcının kimliği doğrulandığında, OnConnect olayı tetiklenir; burada kullanıcıyı bir Gruba ekleyebilirsiniz. Bu demoda, kullanıcının Department özelliği Grup Adı olarak kullanılacaktır. Bir bağlantıyı 1'den fazla gruba ekleyebilirsiniz; yalnızca Groups.Add metodunu ihtiyacınız kadar çağırın.

procedure OnServerConnect(Connection: TsgcWSConnection);
begin
  Server.Groups.Add(TsgcUser(Connection.Data).Department, Connection);
end; 

İstemci bağlantıyı kestiğinde, bağlantı sınıfı Groups özelliğinden otomatik olarak kaldırılır; bu nedenle manuel olarak kaldırmaya gerek yoktur çünkü otomatik olarak yapılır. 

Olayları Kullanma

Groups özelliğinin, bir kullanıcı bir gruba her eklendiğinde veya gruptan çıkarıldığında bildirimde bulunmak için 2 olayı vardır

OnClientAdded: bir gruba yeni bir bağlantı eklendiğinde.

OnClientRemoved: mevcut bir bağlantı bir gruptan kaldırıldığında.

Bu olayları Sunucu başlatılmadan önce yapılandırabilirsiniz. Aşağıdaki örnekte, grubun tüm üyelerine yeni bir üyenin eklendiğini veya mevcut bir üyenin bağlantısının kesildiğini bildiren bir mesaj gönderiyoruz.

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; 

Mesaj Gönderme

Grupları, Mesajları belirli gruplara, birden çok gruba... yayınlamak için kullanabilirsiniz; bazı örnekleri aşağıda bulabilirsiniz.

// 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.'); 

Sunucu ve İstemci uygulamasının kaynaklarını ve windows için derlenmiş ikili dosyaları aşağıda bulabilirsiniz.