DataSnap con WebSocket y HTTP/2

· Características

A partir de sgcWebSockets 4.4.3 puedes sustituir tu aplicación servidor DataSnap por nuestro servidor WebSockets y aprovechar nuevas características como:



Hay 3 tipos diferentes de servidor que puedes usar como sustituto del servidor Indy por defecto TIdHTTPWebBrokerBridge. 

Servidor Características principales Descripción
TsgcWSHTTPWebBrokerBridgeServer Protocolo WebSocket
Protocolo HTTP 1.*
Protocolo XHR
IOCP
Basado en la librería Indy, admite los protocolos WebSocket y HTTP en el mismo puerto. También puede habilitarse IOCP.
TsgcWSHTTP2WebBrokerBridgeServerProtocolo WebSocket
Protocolo HTTP 1.*
Protocolo HTTP/2
Protocolo XHR
IOCP
Basado en la librería Indy, admite los protocolos WebSocket y HTTP/2 en el mismo puerto. También puede habilitarse IOCP.
TsgcWSServer_HTTPAPI_WebBrokerBridgeProtocolo WebSocket
Protocolo HTTP 1.*
Protocolo HTTP/2
Protocolo XHR
IOCP
Basado en la API HTTP.SYS de Microsoft, admite los protocolos WebSocket y HTTP/2 en el mismo puerto. IOCP está habilitado por defecto. Recomendado para el mejor rendimiento.

Usando cualquiera de estos servidores, puedes usar los protocolos HTTP y WebSocket en el mismo puerto de escucha. Puedes despachar peticiones http personalizadas mediante el evento OnHTTPRequest disponible en cualquiera de estos servidores.

Código de ejemplo

Para usar cualquiera de estos servidores debes sustituir el servidor Indy WebBrokerBridge por defecto y configurar las propiedades necesarias para ejecutarlo.

Mira el siguiente código, que sustituye el servidor por defecto y hace uso de TsgcWSHTTPWebBrokerBridgeServer (admite los protocolos 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.