TsgcWebSocketServer_HTTPAPI
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流的处理方式:在内存中或作为文件流。如果流被处理为文件流,则接收的流直接存储在硬盘中,从而避免了内存问题。
要将服务器配置为将多部分/表单数据流保存为文件流,请执行以下步骤:
设置属性HTTPUploadFiles.StreamType = pstFileStream。使用此设置,服务器将在硬盘中存储这些流。
您可以配置文件作为文件流存储的最小字节大小。默认情况下,该值为零,这意味着所有流都将存储为文件流。
使用SaveDirectory存储流的文件夹(如果未设置)将存储在应用程序所在的同一文件夹中。
当客户端发送多部分/表单数据时,内容在边界内编码,如果启用了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:作为文件流。
目录 返回
首页