从 sgcWebSockets 4.4.3 起,您可以将 DataSnap 服务器应用程序替换为我们的 WebSocket 服务器,并利用以下新功能:
- WebSocket 协议
- HTTP/2 协议
- IOCP
有三种不同类型的服务器可用于替换默认的 TIdHTTPWebBrokerBridge Indy 服务器。
| 服务器 | 主要功能 | 描述 |
| TsgcWSHTTPWebBrokerBridgeServer | WebSocket 协议 HTTP 1.* 协议 XHR 协议 IOCP |
基于 Indy 库,在同一端口上支持 WebSocket 和 HTTP 协议。也可启用 IOCP。 |
| TsgcWSHTTP2WebBrokerBridgeServer | WebSocket 协议 HTTP 1.* 协议 HTTP/2 协议 XHR 协议 IOCP | 基于 Indy 库,在同一端口上支持 WebSocket 和 HTTP/2 协议。也可启用 IOCP。 |
| TsgcWSServer_HTTPAPI_WebBrokerBridge | WebSocket 协议 HTTP 1.* 协议 HTTP/2 协议 XHR 协议 IOCP | 基于 Microsoft HTTP.SYS API,在同一端口上支持 WebSocket 和 HTTP/2 协议。默认使用 IOCP,推荐使用以获得最佳性能。 |
使用这些服务器中的任意一种,您都可以在同一监听端口上使用 HTTP 和 WebSocket 协议。可以使用这些服务器上可用的 OnHTTPRequest 事件来分发自定义 HTTP 请求。
示例代码
要使用这些服务器中的任意一种,必须替换默认的 Indy WebBrokerBridge 服务器,并设置必要的属性以运行它。
请查看以下代码,该代码替换默认服务器并使用 TsgcWSHTTPWebBrokerBridgeServer(支持 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.
