A partir de sgcWebSockets 4.4.3 puedes sustituir tu aplicación servidor DataSnap por nuestro servidor WebSockets y aprovechar nuevas características como:
- Protocolo WebSocket
- Protocolo HTTP/2
- IOCP
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. |
| TsgcWSHTTP2WebBrokerBridgeServer | Protocolo 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_WebBrokerBridge | Protocolo 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.
