Depuis sgcWebSockets 4.4.3, tu peux remplacer ton application serveur DataSnap par notre serveur WebSockets et profiter de nouvelles fonctionnalités comme :
- Protocole WebSocket
- Protocole HTTP/2
- IOCP
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é. |
| TsgcWSHTTP2WebBrokerBridgeServer | Protocole 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_WebBrokerBridge | Protocole 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.
