DataSnap avec WebSocket et HTTP/2

· Fonctionnalités

Depuis sgcWebSockets 4.4.3, tu peux remplacer ton application serveur DataSnap par notre serveur WebSockets et profiter de nouvelles fonctionnalités comme :



Il existe 3 types de serveurs que tu peux utiliser en remplacement du serveur Indy par défaut TIdHTTPWebBrokerBridge. 

Serveur Fonctionnalités principales Description
TsgcWSHTTPWebBrokerBridgeServer Protocole WebSocket
Protocole HTTP 1.*
Protocole XHR
IOCP
Basé sur la bibliothèque Indy, prend en charge les protocoles WebSocket et HTTP sur le même port. IOCP peut aussi être activé.
TsgcWSHTTP2WebBrokerBridgeServerProtocole WebSocket
Protocole HTTP 1.*
Protocole HTTP/2
Protocole XHR
IOCP
Basé sur la bibliothèque Indy, prend en charge les protocoles WebSocket et HTTP/2 sur le même port. IOCP peut aussi être activé.
TsgcWSServer_HTTPAPI_WebBrokerBridgeProtocole WebSocket
Protocole HTTP 1.*
Protocole HTTP/2
Protocole XHR
IOCP
Basé sur l'API Microsoft HTTP.SYS, prend en charge les protocoles WebSocket et HTTP/2 sur le même port. IOCP est utilisé par défaut. Recommandé pour de meilleures performances.

En utilisant l'un de ces serveurs, tu peux utiliser les protocoles HTTP et WebSocket sur le même port d'écoute. Tu peux traiter des requêtes HTTP personnalisées via l'événement OnHTTPRequest disponible sur chacun de ces serveurs.

Exemple de code

Pour utiliser l'un de ces serveurs, tu dois remplacer le serveur WebBrokerBridge Indy par défaut et définir les propriétés requises pour le faire fonctionner.

Voici le code qui remplace le serveur par défaut et utilise TsgcWSHTTPWebBrokerBridgeServer (prend en charge les protocoles HTTP + WebSocket).

unit FormUnit1;
interface
uses
  Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.AppEvnts, Vcl.StdCtrls, sgcWebSocket_Server_WebBrokerBridge, Web.HTTPApp,
  sgcWebSocket_Classes, sgcWebSocket_Types;
type
  TForm1 = class(TForm)
    ButtonStart: TButton;
    ButtonStop: TButton;
    EditPort: TEdit;
    Label1: TLabel;
    ApplicationEvents1: TApplicationEvents;
    ButtonOpenBrowser: TButton;
    Button1: TButton;
    chkSSL: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure ButtonStartClick(Sender: TObject);
    procedure ButtonStopClick(Sender: TObject);
    procedure ButtonOpenBrowserClick(Sender: TObject);
  private
    FServer: TsgcWSHTTPWebBrokerBridgeServer;
    procedure StartServer;
  private
    procedure OnWebSocketMessage(aConnection: TsgcWSConnection; const aText:
        string);
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
uses
  WinApi.Windows, Winapi.ShellApi, Datasnap.DSSession;
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
  ButtonStart.Enabled := not FServer.Active;
  ButtonStop.Enabled := FServer.Active;
  EditPort.Enabled := not FServer.Active;
end;
procedure TForm1.ButtonOpenBrowserClick(Sender: TObject);
var
  vURL: string;
  vProtocol: string;
begin
  StartServer;
  vProtocol := 'http';
  if chkSSL.Checked then
    vProtocol := vProtocol + 's';
  vURL := Format(vProtocol + '://127.0.0.1:%s', [EditPort.Text]);
  ShellExecute(0,
        nil,
        PChar(vURL), nil, nil, SW_SHOWNOACTIVATE);
end;
procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  StartServer;
end;
procedure TerminateThreads;
begin
  if TDSSessionManager.Instance <> nil then
    TDSSessionManager.Instance.TerminateAllSessions;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  vURL: string;
  vProtocol: string;
begin
  StartServer;
  vProtocol := 'http';
  if chkSSL.Checked then
    vProtocol := vProtocol + 's';
  vURL := Format(vProtocol + '://127.0.0.1:%s/sgcWebSockets.html', [EditPort.Text]);
  ShellExecute(0,
        nil,
        PChar(vURL), nil, nil, SW_SHOWNOACTIVATE);
end;
procedure TForm1.ButtonStopClick(Sender: TObject);
begin
  TerminateThreads;
  FServer.Active := False;
  FServer.Bindings.Clear;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  FServer := TsgcWSHTTPWebBrokerBridgeServer.Create(Self);
  FServer.OnMessage := OnWebSocketMessage;
end;
procedure TForm1.OnWebSocketMessage(aConnection: TsgcWSConnection; const aText:
    string);
begin
  aConnection.WriteData(aText);
end;
procedure TForm1.StartServer;
begin
  if not FServer.Active then
  begin
    FServer.Bindings.Clear;
    FServer.DefaultPort := StrToInt(EditPort.Text);
    if chkSSL.Checked then
    begin
      FServer.SSLOptions.CertFile := 'sgc.pem';
      FServer.SSLOptions.KeyFile := 'sgc.pem';
      FServer.SSLOptions.RootCertFile := 'sgc.pem';
      FServer.SSLOptions.Port := StrToInt(EditPort.Text);
      FServer.SSLOptions.Version := tls1_2;
    end;
    FServer.SSL := chkSSL.Checked;
    FServer.Active := True;
  end;
end;
end.