A partire da sgcWebSockets 4.4.3, puoi sostituire la tua applicazione server DataSnap con il nostro server WebSocket e sfruttare nuove funzionalità come:
- WebSocket Protocol
- HTTP/2 Protocol
- IOCP
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. |
| TsgcWSHTTP2WebBrokerBridgeServer | WebSocket 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_WebBrokerBridge | WebSocket 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.
