DataSnap con WebSocket e HTTP/2

· Funzionalità

A partire da sgcWebSockets 4.4.3, puoi sostituire la tua applicazione server DataSnap con il nostro server WebSocket e sfruttare nuove funzionalità come:



Esistono 3 diversi tipi di server che puoi usare in sostituzione del server Indy predefinito TIdHTTPWebBrokerBridge. 

Server Funzionalità principali Descrizione
TsgcWSHTTPWebBrokerBridgeServer WebSocket Protocol
HTTP 1.* Protocol
XHR Protocol
IOCP
Basato sulla libreria Indy, supporta i protocolli WebSocket e HTTP sulla stessa porta. È possibile abilitare anche IOCP.
TsgcWSHTTP2WebBrokerBridgeServerWebSocket Protocol
HTTP 1.* Protocol
HTTP/2 Protocol
XHR Protocol
IOCP
Basato sulla libreria Indy, supporta i protocolli WebSocket e HTTP/2 sulla stessa porta. È possibile abilitare anche IOCP.
TsgcWSServer_HTTPAPI_WebBrokerBridgeWebSocket Protocol
HTTP 1.* Protocol
HTTP/2 Protocol
XHR Protocol
IOCP
Basato sull'API Microsoft HTTP.SYS, supporta i protocolli WebSocket e HTTP/2 sulla stessa porta. IOCP è usato per impostazione predefinita. Consigliato per ottenere le migliori prestazioni.

Usando uno qualsiasi di questi server, puoi utilizzare i protocolli HTTP e WebSocket sulla stessa porta in ascolto. Puoi gestire richieste HTTP personalizzate tramite l'evento OnHTTPRequest disponibile su ognuno di questi server.

Codice di esempio

Per utilizzare uno di questi server, devi sostituire il server WebBrokerBridge Indy predefinito e impostare le proprietà richieste per eseguirlo.

Consulta il codice seguente, che sostituisce il server predefinito e utilizza TsgcWSHTTPWebBrokerBridgeServer (supporta i protocolli 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.