天天开心^_^

TsgcWebSocketServer_HTTPAPI

18 12月
作者:popsky|分类:sgcWebSockets控件说明

HTTP服务器API使应用程序能够在不使用Microsoft Internet Information Server(IIS)的情况下通过HTTP进行通信。应用程序可以注册以接收特定URL的HTTP请求、接收WebSocket请求和发送WebSocket响应。HTTP服务器API包括SSL支持,因此应用程序可以在没有IIS的情况下通过安全的HTTP连接交换数据。它还设计用于I/O完成端口。

服务器支持以下协议:

1:WebSockets(需要Windows 8或更高版本)

2:HTTP 1.1

3:HTTP/2(需要Windows 2016+或Windows 10+)。


默认情况下,对于URL注册,此组件要求应用程序以管理员模式运行。如果URL已使用netsh等外部工具注册,则可以在没有管理员权限的情况下运行,请禁用属性BindingOptions。配置SSLCertificate以允许在没有管理员权限的情况下启动应用程序。

将FastMM4/FastMM5设置为项目的第一个单元。


按照以下步骤配置此组件:

1:从选项卡当中拽入TsgcWebSocketServer_HTPAPI到FORM上

2:定义侦听地址和端口:

Server.Host := '127.0.0.1';
Server.Port := 80;

3:设置允许的规格,默认情况下允许所有规格。

    -RFC6455:是标准和推荐的WebSocket规范。

    -Hixie76:这是一个草稿,如果你想支持Safari 4.2这样的旧浏览器,只建议建立Hixie76连接

4:如果需要,可以处理事件:

    -OnConnect:每次建立WebSocket连接时,都会触发此事件。

    -OnDisconnect:打开断开连接

    -OnError:每次出现WebSocket错误(如错误的握手)时,都会触发此事件。

    -OnMessage:每当客户端发送文本消息并被服务器接收时,就会触发此事件。

    -OnBinary:每当客户端发送二进制消息并被服务器接收时,就会触发此事件。

    -OnHandhake:在服务器端评估握手之后激发此事件。

    -OnException:当HTTP服务器抛出异常时,将触发此事件。

    -OnAuthentication:如果启用了身份验证,则触发此事件。您可以检查客户端传递的用户和密码,并启用/禁用Authenticated Variable。

    -OnUnknownProtocol:在编写此文档时,此事件不起作用。

    -OnBeforeHeartBeat:如果启用了HeartBeat,则允许将自定义HeartBeat设置Handled参数设置为True(这意味着不会发送标准的websocket ping)。

    -OnAsynchronous:每次完成异步事件时,都会调用此事件。

    -OnBeforeForwardHTTP:允许将HTTP请求转发到另一个HTTP服务器。使用forward属性启用此功能并设置目标URL。

    -OnAfterForwardHTTP:允许知道转发请求的结果。

5:创建过程并设置属性Active=true


URL Reservation:

HTTP.SYS服务器使用URL保留来指定HTTP将使用哪些URL端点。SYS服务器。

基本URL保留

这是配置服务器最简单的模式,基本上只需设置HTTP的主机和端口。SYS服务器将处理。

示例:如果您的服务器运行在IP 127.0.0.1和端口80上,只需设置以下属性

Server.Host := '127.0.0.1';
Server.Port := 80;

如果服务器在多个IP中运行,并且您希望绑定到多个IPS,请使用NewBinding方法。首先清除Host和Bindings属性,然后使用NewBinding方法定义所有服务器绑定。

Server.Host := '';
Server.Bindings.Clear;
Server.Bindings.NewBinding('127.0.0.1', 80, '');
Server.Bindings.NewBinding('80.50.55.11', 80, '');

如果服务器需要SSL连接,请执行以下操作以定义将用于处理SSL连接的主机和端口。

Server.Host := '127.0.0.1';
Server.Port := 443;
Server.SSL := True;
Server.SSLOptions.Hash := 'CERTIFICATE_HASH';

如果服务器需要具有多个IP地址的SSL连接,请首先清除Host和Bindings属性,然后注册新的Bindings。

Server.Host := '';
Server.Bindings.Clear;
Server.Bindings.NewBinding('127.0.0.1', 443, '', true, 'CERTIFICATE_HASH1');
Server.Bindings.NewBinding('80.50.55.11', 443, '', true, 'CERTIFICATE_HASH2');


最常见的用途

1>OnDisconnect not fired

第一次使用HTTPAPI服务器时,很常见的情况是,当客户端关闭连接时,不会触发OnDisconnect事件。原因是HTTPAPI服务器的工作方式与Indy等其他服务器稍有不同。在Indy服务器中,每个连接都有一个线程,该线程每x毫秒检查一次连接是否处于活动状态。HTTPAPI服务器使用一个线程池来处理所有连接,它不会检查每个连接是否处于活动状态。

为了在客户端关闭连接时得到通知,请执行以下配置:

1:如果使用TsgcWebSocketClient,请设置Options.CleanDisconnect := True。这意味着在连接关闭之前,客户端将尝试向服务器发送连接将关闭的通知。如果服务器收到此消息,将调用OnDisconnect事件。

2:对于其他断开连接,唯一的解决方案是向套接字写入一些内容,如果失败则意味着连接断开。在HTTPAPI服务器上启用HeartBeat,并发送例如60秒的间隔和0的超时。此配置意味着每60秒将ping所有连接,如果任何连接断开,则将触发OnDisconnect事件。你可以降低HeartBeat的值。间隔,但不要太低(例如,1秒太低),因为服务器的性能会受到影响。


2>HTTPAPI Server SSL(HTTPAPI服务器SSL)

服务器可以配置为使用SSL证书,为了获得具有服务器证书的生产服务器,您必须从知名提供商购买证书:Namecheap、godaddy、Thawte……出于测试目的,您可以使用自签名证书(在Demos/Chat中查看,该证书使用自签名的证书)。

获得证书后,必须在服务器中配置将使用哪个证书来加密连接。

Certificate Hash

首先,您需要知道证书的哈希值。在powershell中查找证书的哈希与在证书容器上运行dir命令一样简单。

dir cert:\localmachine\my

哈希是十六进制指纹值。

Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my Thumbprint                                Subject ----------                                ------- C12A8FC8AE668F866B48F23E753C93D357E9BE10  CN=*.mydomain.com

获得Thumbprint值后,只需在TsgcWebSocketServer_HTPAPI.TLSOptions中设置即可。哈希属性。

设置哈希后,只需设置TsgcWebSocketServer_HTPAPI.SSL=true,并且您的服务器已准备好开始。


3>自签名证书

如果您自己的测试需要一些证书,可以在测试机器中创建自签名证书,请执行以下步骤:

1:以管理员身份运行Powershell

2:运行以下命令以创建证书:New-SelfSignedCertificate -DnsName localhost -CertStoreLocation "cert:\LocalMachine\My"


如果成功,您将获得关于创建新证书的确认。只需复制Thumbprint并粘贴到TsgcWebSocketServer_HTPAPI.TLSOptions.Hash属性。


3:可选,您可以将自签名证书添加为受信任的证书颁发机构

Run MMC -32 as administrator

3.1.选择文件/添加或删除管理单元

3.2.选择证书,然后单击添加

3.3.选择计算机帐户,然后按Next。

3.4.选择本地计算机,然后按“确定”。您现在将获得证书。

4.5.从个人/证书中选择证书并粘贴到受信任的根证书颁发机构/证书上。


4>Custom Headers(自定义头)

您可以自定义HTTP的响应。SYS服务器使用响应对象的CustomHeaders属性。

只需设置CustomHeaders的值,头名称+头值由换行符分隔。

示例:如果要添加以下标题,请在下面找到示例代码

Access-Control-Allow-Origin: *
Acces-Control-Allow-Methods: GET, POST, OPTIONS, PUT, PATCH, DELETE
procedure OnHTTPRequest(aConnection: TsgcWSConnection_HTTPAPI; const aRequestInfo: THttpServerRequest; 
  var aResponseInfo: THttpServerResponse);
begin
  aResponseInfo.ResponseNo := 200;
  aResponseInfo.CustomHeaders := 'Access-Control-Allow-Origin: *' + #13#10 + 'Acces-Control-Allow-Methods: ' +
    'GET, POST, OPTIONS, PUT, PATCH, DELETE';
end;


5>Send Text Response(发送文本响应)

使用事件OnHTTPRequest处理HTTP请求。

THttpServerRequest包含HTTP请求数据。

  • Document: 对等方试图访问的文档。

  • Method: HTTP方法(“GET”、“POST”…)

  • Headers: HTTP请求的Headers。

  • AcceptEncoding: 接受编码变量,例如:“gzip,deflate,br”。

  • ContentType: example: "text/html"

  • Content: 请求的内容(如果存在)。

  • QueryParams: 查询参数。

  • Cookies: cookie(如果存在)。

  • ContentLength: 内容的大小。

  • AuthExists, AuthUsername, AuthPassword: 认证请求数据。

  • Stream: 如果http请求具有主体,则这是主体的流。

THttpServerResponse包含HTTP响应Data。

       ContentText: 是文本形式的响应。

  • ContentType: 示例:“text/html”。如果要用UTF8编码ContentText,请设置charset='utf-8'。示例: text/html; charset=utf-8

  • CustomHeaders:如果需要发送自己的标头,请使用此变量

  • AuthRealm: 如果服务器需要身份验证,请设置此变量。

  • ResponseNo:HTTP响应号,例如:200表示正确的响应。

  • ContentStream: 如果响应包含流,请在此处设置(不要释放流,它将自动释放)。

  • FileName: 如果响应是文件名,请在此处设置文件名的完整路径。

  • Date, Expires, LastModified:响应的datetime变量。

  • CacheControl: 允许自定义缓存行为。

示例:如果服务器接收到对文档“/test.html”的GET请求,发送OK响应,否则如果是GET请求,则发送404;如果是其他方法,则发送错误500。

procedure OnHTTPRequest(aConnection: TsgcWSConnection_HTTPAPI; const aRequestInfo: THttpServerRequest; 
  var aResponseInfo: THttpServerResponse);
begin
  aResponseInfo.ResponseNo := 200;
  aResponseInfo.CustomHeaders := 'Access-Control-Allow-Origin: *' + #13#10 + 'Acces-Control-Allow-Methods: ' +
    'GET, POST, OPTIONS, PUT, PATCH, DELETE';
end;procedure OnHTTPRequest(aConnection: TsgcWSConnection_HTTPAPI; 
	const aRequestInfo: THttpServerRequest; 
	var aResponseInfo: THttpServerResponse);
begin
  if aRequestInfo.Method = 'GET' then
  begin
    if aRequestInfo.Document = '/test.html' then
	begin
	  aResponseInfo.ResponseNo := 200;
	  aResponseInfo.ContentText := 'OK';
	  aResponseInfo.ContentType := 'text/html; charset=UTF-8';
	end
	else
	  aResponseInfo.ResponseNo := 404;
  end
  else 
    aResponseInfo.ResponseNo := 500;
end;


6>Send File Response

如果要将文件名作为HTTP请求的响应发送,请使用THttpServerResponse对象的FileName属性。

procedure OnHTTPRequest(aConnection: TsgcWSConnection_HTTPAPI; 
	const aRequestInfo: THttpServerRequest; 
	var aResponseInfo: THttpServerResponse);
begin
  if aRequestInfo.Method = 'GET' then
  begin
    if aRequestInfo.Document = '/test.zip' then
	begin
	  aResponseInfo.ResponseNo := 200;
	  aResponseInfo.FileName := 'c:\download\test.zip';
	  aResponseInfo.ContentType := 'application/zip';
	end
	else
	  aResponseInfo.ResponseNo := 404;
  end
  else 
    aResponseInfo.ResponseNo := 500;
end;


7>Post Big Files(大文件上传)

支持者:

TsgcWebSocketHTTPServer

TsgcWebSocketServer_HTTPAPI

当HTTP客户端发送多部分/表单数据流时,服务器会将该数据流保存在内存中。当文件很大时,服务器可能会出现内存不足的异常,为了避免这些异常,服务器有一个名为HTTPUploadFiles的属性,您可以在其中配置POST流的处理方式:在内存中或作为文件流。如果流被处理为文件流,则接收的流直接存储在硬盘中,从而避免了内存问题。

要将服务器配置为将多部分/表单数据流保存为文件流,请执行以下步骤:

  1. 设置属性HTTPUploadFiles.StreamType = pstFileStream。使用此设置,服务器将在硬盘中存储这些流。

  2. 您可以配置文件作为文件流存储的最小字节大小。默认情况下,该值为零,这意味着所有流都将存储为文件流。

  3. 使用SaveDirectory存储流的文件夹(如果未设置)将存储在应用程序所在的同一文件夹中。

  4. 当客户端发送多部分/表单数据时,内容在边界内编码,如果启用了RemoveBoundaries属性,则在接收到完整流后,将自动提取边界的内容。

示例代码

首先创建一个新的服务器实例,并将Streams保存为File Streams。

oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 5555;
oServer.HTTPUploadFiles.StreamType := pstFileStream;
oServer.Active := True;

然后使用以下配置创建一个新的html文件

<html>
    <head><title>sgcWebSockets - Upload Big File</title></head>
    <body>
        <form action="http://127.0.0.1:5555/file" method="post" enctype="multipart/form-data" accept-charset="UTF-8">
            <input type="file" name="file_1" />
            <input type="submit" />
        </form>
    </body>
</html>

最后,用web浏览器打开html文件并将文件发送到服务器。服务器将创建一个扩展名为“.sgc_ps”的新文件流,当流被完全接收到时,它将从边界提取文件。

事件:

有2个事件可用于自定义上载文件流(需要启用属性HTTPploadFiles.RemoveBoundaries)

OnHTTPUploadBeforeSaveFile

此事件在保存文件之前激发,并允许自定义接收的文件的名称。

procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; var aFileName: string; var aFilePath: string);
begin
  if aFileName = "test.jpg" then
    aFileName := "custom_test.jpg";
end;

OnHTTPUploadAfterSaveFile

保存文件后激发此事件,并允许知道保存的文件的名称。

procedure OnHTTPUploadBeforeSaveFileEvent(Sender: TObject; const aFileName: string; const aFilePath: string);
begin
  DoLog("File Received: " + aFileName);
end;

OnHTTPUploadReadInput

当解码器读取与文件输入不同的输入值时(例如:如果表单具有一些变量,如名称、日期…),就会触发此事件。

procedure OnHTTPUploadReadInputEvent(Sender: TObject; const aName: string; const aValue: string);
begin
  DoLog("Input value received: " + aName + ":" + aValue);
end;


属性

Host:如果该属性有一个值,它将用于注册URL。如果使用Bindings属性定义服务器绑定,请清除此属性的值。

Port:默认侦听端口,如果Host属性具有值,则将使用Host+port注册URL。

Timeouts:允许覆盖HTTP API服务器的默认超时。

    -EntityBody:请求实体主体允许到达的时间(秒)。

    -DrainEntityBody:HTTP Server API在Keep Alive连接上耗尽实体主体所需的时间(以秒为单位)。

    -RequestQueue:在应用程序接收请求之前,允许请求保留在请求队列中的时间(以秒为单位)。

    -IdleConnection:允许空闲连接的时间(秒)。

    -HeaderWait:HTTP服务器API解析请求头所允许的时间(秒)。

    -MinSendRate:响应的最小发送速率(字节/秒)。默认响应发送速率为每秒150字节。

MaxConnections:最大连接数(零表示无限制,默认值)。

MaxBandwidth:以字节/秒为单位的最大允许带宽速率(零表示无限制,默认值)。

ThreadPoolSize:默认情况下32(允许的最大值为64)允许设置HTTP API服务器的线程数。

ReadBufferSize:默认情况下16384允许在读取套接字数据时修改缓冲区大小的大小。

Asynchronous:默认情况下禁用,如果启用,则发送的消息不会等到完成。您可以在异步事件上检查异步何时完成。

SSLOptions:在这里,您可以自定义ssl属性。

    -CertStoreName:(可选)允许设置证书所在的证书存储的名称。如果未设置值,则默认名称为“MY”。

    -Hash:这是证书的十六进制指纹值,服务器需要它来检索证书。您可以使用powershell找到证书的哈希,在证书存储上运行“dir”命令,例如:dir cert:\localmachine\my。


方法

Broadcast:向所有连接的客户端发送消息。

Message / Stream:要发送到所有客户端的消息或流。

Channel:如果指定频道,则消息将仅发送给订户。

Protocol:如果已定义,则消息将仅发送到特定协议。

Exclude:如果已定义,则排除连接guid的列表(用逗号分隔)。

Include:如果已定义,则包含连接guid列表(用逗号分隔)。

WriteData:向单个或多个客户端发送消息。每当客户端建立WebSocket连接时,此连接都由Guid标识,您可以使用此Guid向客户端发送消息。

Ping:向所有连接的客户端发送ping。

DisconnectAll:断开所有活动连接。

HTTPUploadFiles:默认情况下,当客户端使用POST流发送文件时,文件将保存在内存中。如果要将这些流直接保存为文件以避免内存问题,请将StreamType设置为pstFileStream,文件将保存在硬盘中。

MinSize:要保存为文件流的流的最小大小(字节)。默认情况下为零,这意味着所有流都将保存为FileStreams(如果StreamType=pstFileStream)。

RemoveBoundaries:使用POST多部分/表单数据上载的文件封装在边界中,如果启用此属性,文件将从边界提取并保存在硬盘中。

SaveDirectory:保存文件的文件夹。如果为空,将保存在应用程序所在的同一文件夹中。

StreamType:默认情况下,将保存流的流的类型。

    -pstMemoryStream:作为存储器流。

    -pstFileStream:作为文件流。

浏览30 评论0
返回
目录
返回
首页
TsgcWebSocketHTTPServer TsgcWebSocketClient_WinHTTP

发表评论