天天开心^_^

TsgcWebSocketClient

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

TsgcWebSocketClient实现了客户端WebSocket组件,并可以连接到WebSocket服务器。按照以下步骤配置此组件:

标准说明:

  1. 将TsgcWebSocketClient组件拖到表单上。


  2. 设置主机和端口(默认值为80)以连接到可用的WebSocket服务器。您可以设置URL属性,主机、端口、参数…将从URL更新。例子:wss://127.0.0.1:8080/ws/将导致:

oClient := TsgcWebSocketClient.Create(nil);
oClient.Host := '127.0.0.1';
oClient.Port := 80;
oClient.TLS := True;
oClient.Options.Parameters := '/ws/';

    3.您可以选择是否需要TLS(安全连接),默认情况下为“未激活”。


    4.您可以通过HTTP代理服务器进行连接,您需要定义代理属性:

    Host: 代理服务器的主机名。

    Port:代理服务器的端口号。

    Username:要进行身份验证的用户,如果匿名,则为空。

    Password: 用于验证的密码,如果匿名,则为空。


    5.如果服务器支持压缩,则可以启用压缩来压缩发送的消息。


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

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

    HIxie76:所有的都为false


    7:事件如下

    OnConnect:当建立WebSocket连接时,将触发此事件

    OnDisconnect:当WebSocket连接断开时,将触发此事件

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

    OnMessage:每次服务器发送文本消息时,都会触发此事件

    OnBinary:每次服务器发送二进制消息时,都会触发此事件

    OnFragmented:从消息中接收片段时(仅在Options.FragmentedMessages=frgAll或frgOnlyFragmented时激发)。

    OnHandhake:在客户端评估握手时触发此事件。

    OnException:每次发生异常时,都会触发此事件。

    OnSSLVerifyPeer:如果启用了验证证书,在这种情况下,您可以验证服务器证书是否有效并接受。

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

    OnBeforeConnect:在客户端尝试连接到服务器之前,将调用此事件。

    OnBeforeWatchDog:如果启用了WatchDod,则允许将自定义WatchDogHandled参数设置为True(这意味着不会尝试连接到服务器)。您也可以在尝试重新连接之前更改“服务器连接”属性,例如:如果第一次失败,则连接到备用服务器。


    8.设置属性Active=true以启动新的websocket连接


常见用法:

1:连接


1>如何连接WebSocket服务器

URL属性

连接到WebSocket服务器的最简单方法是使用URL属性并调用Active=true。
oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.Active := true;


主机、端口和参数

您可以使用主机和端口属性连接到WebSocket服务器。
oClient := TsgcWebSocketClient.Create(nil);
oClient.Host := 'www.esegece.com';
oClient.Port := 2053;
oClient.TLS := true;
oClient.Active := true;


2>打开客户端连接

一旦您的客户端配置为连接到服务器,就有3个不同的选项来调用Open a new connection。

活动属性

打开新连接的最简单方法是将Active属性设置为true。这将尝试使用组件配置连接到服务器。

若将Active属性设置为false,则将在活动时关闭连接。

此方法在调用方的同一线程中执行。所以,如果在主线程中调用,方法将在应用程序的主线程中执行。

打开连接
oClient := TsgcWebSocketClient.Create(nil);
...
oClient.Active := true; //当您调用Active=true时,您仍然无法向服务器发送任何数据,因为客户端可能仍在连接,您必须先等待OnConnect事件被激发,然后才能开始向服务器发送消息。

关闭连接
oClient.Active := false; //当您调用Active=false时,您无法确定此代码之后连接已经关闭,所以必须等待OnDisconnect事件被激发。

启动/停止方法

当您调用Start()或Stop()来连接/断开与服务器的连接时,将在辅助线程中执行,因此它不会阻塞调用的线程。如果您想连接到服务器并继续下面的代码,请使用此方法。

打开连接
oClient := TsgcWebSocketClient.Create(nil);
...
oClient.Start(); //当您调用Start()时,您仍然无法向服务器发送任何数据,因为客户端可能仍在连接,您必须先等待OnConnect事件被激发,然后才能开始向服务器发送消息。

关闭连接
oClient.Stop(); //当您调用Stop()时,您不能确定在这段代码之后连接已经关闭,所以您必须等待OnDisconnect事件被触发。

连接/断开方法

当您调用Connect()或Disconnect()来打开/关闭来自服务器的连接时,这将在调用的同一线程中执行,但它会等待进程完成。您必须设置超时以设置等待进程完成的最长时间(默认为10秒)

连接到服务器并等待5秒
oClient := TsgcWebSocketClient.Create(nil);
...
if oClient.Connect(5000) then  //如果在调用Connect()方法后,结果是成功的,则您已经可以向服务器发送消息,因为连接是活动的。
    oClient.WriteData('Hello from client')
else  
    Error();
    
断开连接并且等待10秒
if oClient.Disconnect(10000) then  //如果在调用Disconnect()事件后结果成功,则表示连接已关闭。
    ShowMessage('Disconnected')
else  
    ShowMessage('Not Disconnected');

OnBeforeConnect事件可用于在客户端尝试连接到服务器之前自定义服务器连接属性。


3>关闭客户端连接

可以使用Active属性、Stop或Disconnect方法关闭连接

CleanDisconnect(清洁断开)

当连接关闭时,您可以通过发送关于关闭连接的消息通知其他对等方连接已关闭,以启用此功能,即设置选项。CleanDisconnect属性设置为true。

若启用此属性,则在关闭连接之前,将向服务器发送一条关闭消息,通知客户端正在关闭连接。

Disconnect(断开连接)

TsgcWSConnection有一个名为Disconnect()的方法,它允许在套接字级别断开连接。若调用此方法,套接字将直接断开,而无需等待服务器的任何响应。您可以使用此方法发送关闭代码。

Close(关闭)

TsgcWSConnection有一个名为Close()的方法,它允许向服务器发送请求关闭连接的消息,如果服务器收到此消息,则必须关闭连接,客户端将收到连接关闭的通知。您可以使用此方法发送关闭代码。


4>保持连接活动

一旦您的客户端连接到服务器,有时会由于信号差、连接错误而关闭连接……有两个属性有助于保持连接活动。

HeartBeat(心跳)

HeartBeat属性允许每X秒发送一次Ping以保持连接活动。如果对等端之间没有数据交换,某些服务器会关闭TCP连接。HeartBeat解决了这个问题,每特定间隔发送一次ping。通常,这足以保持连接处于活动状态,但若在X秒后未收到服务器的响应,则若要关闭连接,可以设置超时间隔。

每30秒发送一次ping
oClient := TsgcWebSocketClient.Create(nil);
oClient.HeartBeat.Interval := 30;
oClient.HeartBeat.Timeout := 0;
oClient.HeartBeat.Enabled := true;
oClient.Active := true;
//有一个名为OnBeforeHeartBeat的事件,它允许自定义HeartBeat行为。默认情况下,如果启用了HeartBeat,则客户端将按HeartBeat设置的每X秒发送一次websocket ping。Interval属性。
//OnBeforeHeartBeat有一个名为Handled的参数,默认情况下为false,这意味着流由TsgcWebSocketClient组件控制。如果将值设置为True,则不会发送ping,并且可以使用Connection类发送自定义消息。

WatchDog(监察人[看门狗])

如果启用了看门狗,当客户端检测到断开连接时,看门狗会尝试每X秒重新连接一次,直到连接再次激活。

oClient := TsgcWebSocketClient.Create(nil); //断开连接后每10秒重新连接一次,尝试次数不限。
oClient.WatchDog.Interval := 10;
oClient.WatchDog.Attempts := 0;
oClient.WatchDog.Enabled := true;
oClient.Active := true;
//您可以使用OnBeforeWatchDog事件更改客户端尝试连接的服务器。示例:重试3次后,如果客户端无法连接到服务器,将尝试连接到辅助服务器。
//Handled属性如果设置为True,则表示客户端不会尝试重新连接。


5>断开的连接

一旦建立了连接,如果没有对等方发送任何数据,则不会通过网络发送数据包。TCP是一个空闲协议,因此它假定连接是活动的。

Disconnection reasons(断开连接的原因)

1.应用程序关闭:当进程完成时,通常会发送一个FIN数据包,该数据包向另一个对等方确认连接已关闭。但如果进程崩溃,则无法保证该数据包将被发送到其他对等端。

2.设备关闭:如果设备关闭,很可能不会有任何通知。

3.网络电缆未拔出:如果网络电缆被拔出,路由器关闭的情况相同,则不会传输数据,因此连接不会关闭。

4.来自路由器的信号丢失:若应用程序失去了来自路由器的信息,那个么连接仍然有效。

Detect Half-Open Disconnections(检测半开断开)

您可以尝试使用以下方法检测断开:

1.第二个连接。您可以尝试打开第二个连接并尝试连接,但这有一些缺点,例如您正在消耗更多的资源,创建新线程……如果其他对等方已重新启动,第二个链接将工作,但第一个连接无法工作。

2.Ping其他对等方.如果你试图用半开放的连接发送ping或其他消息,你会发现你没有收到任何错误。

3.在TCP套接字级别启用KeepAlive.

TCP保活数据包只是一个ACK,其序列号设置为比连接的当前序列号少一个。接收这些ACK之一的主机以当前序列号的ACK进行响应。Keep-alives可用于验证连接远端的计算机是否仍然可用。TCP保持活动可以在每个TCPKeepAlive发送一次。时间(默认为7200000毫秒或两小时),如果没有其他数据或更高级别的保持活动通过TCP连接传输。如果对保活没有响应,则每TCPKeepAlive重复一次。间隔秒。KeepAliveInterval默认为1000毫秒。

您可以启用每个连接KeepAlive,并允许TCP协议检查连接是否处于活动状态。如果要检测断开的连接(例如:拔下网线时),这是首选方法。

oClient := TsgcWebSocketClient.Create(nil);
oClient.TCPKeepAlive.Enabled := True;
oClient.TCPKeepAlive.Time := 5000;
oClient.TCPKeepAlive.Interval := 1000;


6>连接TCP服务器

TsgcWebSocketClient可以连接到WebSocket服务器,但也可以连接到普通TCP服务器。

URL Property(URL属性)

连接到WebSocket服务器的最简单方法是使用URL属性并调用Active=true。

oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'tcp://127.0.0.1:5555'; //TCP连接模式
oClient.Active := true;

主机、端口和参数

oClient := TsgcWebSocketClient.Create(nil);
oClient.Specifications.RFC6455 := false;
oClient.Host := '127.0.0.1';
oClient.Port := 5555;
oClient.Active := true;


7>WebSocket重定向

当客户端连接到WebSocket服务器时,服务器可以返回HTTP响应代码30x。如果响应代码是301,则表示位置已永久移动,新的url将在位置HTTP标头中通知。

WebSocket客户端自动处理重定向,因此如果检测到服务器响应包含重定向,它将断开实际连接并尝试连接到新的位置URL。


2:安全服务器


1>连接安全服务器

TsgcWebSocketClient可以使用安全和非安全连接连接到WebSocket服务器。

您可以使用URL属性或主机/端口属性配置安全连接.

TLSOptions(TLS选项)

在TLSOptions属性中,有用于自定义安全连接的属性。最重要的属性是version,它指定TLS协议的版本。通常将TLS属性设置为true和TLSOptions。tlsUndefined的版本对于大多数WebSocket服务器来说已经足够了。

TLSOptions.Version 版本允许设置用于连接到服务器的TLS版本,或允许客户端从所有可用的TLS版本中协商TLS版本(当值为tlsUndefined时,这是默认值)。

如果尝试连接到TLS协议的服务器时遇到错误,则此服务器很可能需要比您设置的TLS版本更高的TLS版本。

如果TLSOptions.IOHandler设置为iohOpenSSL,您需要部署OpenSSL库(即处理所有TLS内容的库),请查看以下关于OpenSSL的文章。

如果TLSOptions.IOHandler设置为iohSChannel,则无需部署任何库(仅支持windows)。


2>证书OpenSSL

当服务器要求客户端使用SSL证书连接时,请使用TsgcWebSocketClient的TLSOptions属性设置证书文件。证书必须为PEM格式,因此如果证书具有不同的格式,则必须首先转换为PEM。

通过OpenSSL库的连接需要TLSOptions.IOHandler = iohOpenSSL.


3>证书SChannel

当服务器要求客户端使用SSL证书连接时,请使用TsgcWebSocketClient的TLSOptions属性设置证书文件。

通过SChannel的连接需要TLSOptions.IOHandler = iohSChannel.

SChannel支持两种类型的证书身份验证:

1.使用PFX证书

2.设置windows系统中已安装证书的哈希证书。

PFX Certificate(PFX证书)

PFX证书是一个包含证书和私钥的文件,有时您有PEM格式的证书,因此在使用它之前,必须将其转换为PFX。

使用以下openssl命令将PEM证书转换为PFX

openssl pkcs12 -inkey certificate-pem.key -in certificate-pem.crt -export -out certificate.pfx

一旦证书具有PFX格式,您只需要部署证书并在TLSOptions.Certificate中进行设置。


TLSOptions.IOHandler = iohSChannel
TLSOptions.CertFile = <certificate path>
TLSOptions.Password = <certificate optional password>

Hash Certificate(哈希证书)

如果证书已安装在windows证书存储中,则只需知道证书指纹并在TLSOptions.SChannel_Options属性中设置即可。

在powershell中查找证书的哈希与在证书容器上运行dir命令一样简单。

dir cert:\localmachine\my

哈希是十六进制指纹值。

获得Thumbprint值后,必须在TLSOptions.SChannel_Options属性哈希和证书的位置。

TLSOptions.IOHandler = iohSChannel
TLSOptions.SChannel_Options.CertHash = <certificate thumbprint>
TLSOptions.SChannel_Options.CertStoreName = <certificate store name>
TLSOptions.SChannel_Options.CertStorePath = <certificate store path>
TLSOptions.Password = <certificate optional password>


3:SChannel获取连接信息

客户端连接到安全服务器后,您可以请求有关正在使用的版本(TLS 1.2、TLS 1.3…)、使用的密码、强度等的信息。

调用SChannel Handler的函数GetInfo以访问此信息。您可以使用OnSSLAfterCreateHandler方法访问SSL处理程序,该方法在创建SChannel处理程序后调用。客户端连接到服务器后,如果分配了SSL处理程序,则调用函数GetInfo,如果成功,将返回连接数据。

var  SSL: TsgcIdSSLIOHandlerSocketSChannel;

oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.TLSOptions.Version := tls1_2;
oClient.TLSOptions.IOHandler := iohSChannel;
oClient.OnSSLAfterCreateHandler := OnSSLAfterCreateHandlerEvent;
oClient.OnConnect := OnConnectEvent;
oClient.Active := True;

procedure OnSSLAfterCreateHandlerEvent(Sender: TObject; aType: TwsSSLHandler; aSSLHandler: TIdSSLIOHandlerSocketBase);
begin  
    if aSSLHandler.ClassType = TsgcIdSSLIOHandlerSocketSChannel  then    
        SSL := TsgcIdSSLIOHandlerSocketSChannel(aSSLHandler);
end;

procedure OnConnectEvent(Connection: TsgcWSConnection);
var  oInfo: TsgcSChannelConnectionInfo;
begin  
    if Assigned(SSL) then  
    begin    
        oInfo := SSL.GetInfo;
        if (oInfo.Protocol <> tls1_2) then     
            raise Exception.Create('Client cannot connect using TLS 1.2');
     end;
end;


3:Send Messages(发送消息)

1>发送文本消息

一旦客户端连接到服务器,它就可以向服务器发送文本消息。要发送文本消息,只需调用WriteData()方法并发送文本消息。

调用To WriteData()方法并发送文本消息。此方法在调用的同一线程上执行。

TsgcWebSocketClient1.WriteData('My First sgcWebSockets Message!.');

如果QueueOptions.Text具有与qmNone不同的值,而不是在调用的同一线程上处理,而是在辅助线程上处理。默认情况下,此选项被禁用。


2>发送二进制消息

一旦客户端连接到服务器,它就可以向服务器发送二进制消息。要发送文本消息,只需调用WriteData()方法并发送二进制消息。

调用To WriteData()方法并发送二进制消息。此方法在调用的同一线程上执行。

oStream := TMemoryStream.Create(nil);
Try 
  TsgcWebSocketClient1.WriteData(oStream);
Finally  
  oStream.Free;
End;

如果QueueOptions.Binary的值与qmNone的值不同,它不会在调用的同一线程上处理,而是在辅助线程上处理。默认情况下,此选项被禁用。


4:Receive Messages(接收消息)

1>接收文本消息

当客户端接收到文本消息时,OnMessage事件被触发,只需读取Text参数即可知道接收到的消息字符串。

procedure OnMessage(Connection: TsgcWSConnection; const Text: string);
begin  
    ShowMessage('Message Received from Server: ' + Text);
end;

默认情况下,客户端使用neAsynchronous方法来调度OnMessage事件,这意味着该事件是在主线程的上下文中执行的,因此更新表单的任何控件都是线程安全的。

如果您的客户端收到大量消息,或者您需要控制与其他线程的同步,请将NotifyEvents属性设置为neNoSync,这意味着OnMessage事件将在连接线程的上下文中执行,因此如果您需要更新表单的任何控制或访问共享对象,则必须实现自己的同步方法。


2>接收二进制消息

当客户端接收到二进制消息时,OnBinary事件被触发,只需读取Data参数即可知道接收到的二进制消息。

procedure OnBinary(Connection: TsgcWSConnection; const Data: TMemoryStream);
var  
    oBitmap: TBitmap;
begin  
    oBitmap := TBitmap.Create;
      Try    
        oBitmap.LoadFromStream(Data);
        Image1.Picture.Assign(oBitmap);
    Log(
      '#image uncompressed size: ' + IntToStr(Data.Size) +
      '. Total received: ' + IntToStr(Connection.RecBytes));
  Finally    
        FreeAndNil(oBitmap);
  End;
end;

默认情况下,客户端使用neAsynchronous方法来调度OnMessage事件,这意味着该事件是在主线程的上下文中执行的,因此更新表单的任何控件都是线程安全的。

如果您的客户端收到大量消息,或者您需要控制与其他线程的同步,请将NotifyEvents属性设置为neNoSync,这意味着OnMessage事件将在连接线程的上下文中执行,因此如果您需要更新表单的任何控制或访问共享对象,则必须实现自己的同步方法。


5:Authentication(身份验证)

1>客户端身份验证

TsgcWebSocket客户端支持4种类型的身份验证:

1.Basic:在WebSocket HandShake期间发送HTTP头,用户和密码编码为基本授权。

2.Token:在WebSocket HandShake期间发送一个令牌作为HTTP头,只需在Authentication.Token中设置。AuthToken服务器所需的令牌。

3.Session:第一个客户端向服务器请求HTTP会话,若服务器返回会话,则在WebSocket HandShake的GET HTTP Header中传递。(*sgcWebSockets库自己的授权方法)。

4.URL:客户端使用WebSocket HandShake的GET HTTP标头请求授权。(*sgcWebSockets库自己的授权方法)。


Authorization Basic

是一种简单的授权方法,其中用户和密码被编码并作为HTTP标头传递。只需设置用户和密码,并仅启用基本授权类型即可使用此方法。

oClient := TsgcWebSocketClient.Create(nil);
oClient.Authorization.Enabled := true;
oClient.Authorization.Basic.Enabled := true;
oClient.Authorization.User := 'your user';
oClient.Authorization.Password := 'your password';
oClient.Authorization.Token.Enabled := false;
oClient.Authorization.URL.Enabled := false;
oClient.Authorization.Session.Enabled := false;
oClient.Active := True;

Authorization Token

允许使用JWT获取授权,要求您使用任何外部工具(例如:使用HTTP连接、OAuth2…)获取令牌。

如果附加OAuth2组件,则可以自动获取此令牌。阅读有关OAuth2的更多信息。

基本上,您必须设置AuthToken并启用令牌身份验证。

oClient := TsgcWebSocketClient.Create(nil);
oClient.Authorization.Enabled := true;
oClient.Authorization.Token.Enabled := true;
oClient.Authorization.Token.AuthToken := 'your token';
oClient.Authorization.Basic.Enabled := false;
oClient.Authorization.URL.Enabled := false;
oClient.Authorization.Session.Enabled := false;
oClient.Active := True;

Authorization Session

第一个客户端使用请求新会话的HTTP连接连接到服务器,如果成功,服务器将返回SessionId,客户端将在WebSockets HandShake的GET HTTP Header中发送此SessionId。

需要设置UserName 和 Password 和 Session Authentication设置为True。

oClient := TsgcWebSocketClient.Create(nil);
oClient.Authorization.Enabled := true;
oClient.Authorization.Session.Enabled := true;
oClient.Authorization.User := 'your user';
oClient.Authorization.Password := 'your password';
oClient.Authorization.Basic.Enabled := false;
oClient.Authorization.URL.Enabled := false;
oClient.Authorization.Token.Enabled := false;
oClient.Active := True;

Authorization URL

此身份验证方法只需在WebSockets HandShake的GET HTTP标头中传递用户名和密码。

oClient := TsgcWebSocketClient.Create(nil);
oClient.Authorization.Enabled := true;
oClient.Authorization.URL.Enabled := true;
oClient.Authorization.User := 'your user';
oClient.Authorization.Password := 'your password';
oClient.Authorization.Basic.Enabled := false;
oClient.Authorization.Session.Enabled := false;
oClient.Authorization.Token.Enabled := false;
oClient.Active := True;


6:其它

1>

有时通信中会出现一些错误,服务器可能会因为未经授权或消息格式不正确而断开连接……有2个事件捕获了错误

OnError

每当WebSocket协议中出现错误(如无效消息类型、无效utf8字符串。。。

procedure OnError(Connection: TsgcWSConnection; const Error: string);
begin  
    WriteLn('#error: ' + Error);
end;

OnException

每当出现写入套接字不活动、访问不存在的对象等异常时,就会触发此事件

procedure OnException(Connection: TsgcWSConnection; E: Exception);
begin  
    WriteLn('#exception: ' + E.Message);
end;

默认情况下,当服务器关闭连接时,将触发异常,如果您不希望触发这些异常,只需在Options.RaiseDisconnectExceptions中禁用即可。


2>客户端WebSocket HandShake

WebSocket协议使用HTTP HandShake从HTTP协议升级到WebSocket。此握手由TsgcWebSocket客户端组件内部处理,但若服务器需要一些自定义HTTP头信息,则可以添加自定义HTTP头。

如果需要添加此HTTP标头“Client:sgcWebSockets”

procedure OnHandshake(Connection: TsgcWSConnection; var Headers: TStringList);
begin  
    Headers.Add('Client: sgcWebSockets');
end;

您也可以使用OnHandShake事件在发送到服务器之前检查HandShake字符串。


3>客户端注册协议

默认情况下,TsgcWebSocketClient不使用任何SubProtocol,基本上websocket子协议是建立在websocket协议之上并定义自定义消息协议的,websocket的子协议示例可以是MQTT、STOMP。。。

WebSocket SubProtocol名称在WebSocket HandShake中作为HTTP标头发送,此标头由服务器处理,如果服务器支持此子协议,则将接受连接,如果不支持,则将自动关闭连接

连接到SubProtocol名称为“myprotocol”的websocket服务器

Client := TsgcWebSocketClient.Create(nil);
Client.Host := 'server host';
Client.Port := server.port;
Client.RegisterProtocol('myprotocol');
Client.Active := True;


方法说明:

1:WriteData()

向WebSocket服务器发送消息。可能是字符串或MemoryStream。如果设置了“大小”,如果消息的大小大于设置,则数据包将被拆分。

2:Ping();

向服务器发送ping。如果指定了超时,它将等待响应,直到超过超时,如果没有响应,则关闭连接。

3:Start

使用辅助线程连接到服务器,这可以防止应用程序在尝试连接时冻结。

4:Stop

使用辅助线程断开与服务器的连接,这可以防止应用程序在尝试断开连接时冻结。

5:Connect

尝试连接到服务器并等待连接成功或出现错误。

6:Disconnect

尝试断开与服务器的连接,并等待断开成功或出现错误。


属性说明:

Authentication(身份验证):如果启用,WebSocket连接将尝试通过用户名和密码进行身份验证。

实现4种类型的WebSocket身份验证

参考 Authentication(身份验证)


Host:服务器的IP或DNS名称。


HeartBeat(心跳):如果启用,请尝试保持WebSocket连接活动,每x秒发送一次ping。

Interval:每次ping间隔的秒数。

Timeout:超时秒数


TCPKeepAlive(TCP保活):如果启用,则在TCP套接字级别使用keep-alive,在Windows中将启用SIO_KEEPALIVE_VALS(如果支持),如果不支持,则使用keep-alive。默认情况下禁用。

Time:如果在X时间之后套接字没有发送任何东西,它将发送一个数据包以保持连接(以毫秒为单位的值)。

Interval:发送保活数据包后,如果间隔后没有收到响应,它将发送另一个数据包(以毫秒为单位的值)。


ConnectTimeout(连接超时):连接就绪前的最长时间(毫秒)。


LoadBalancer(负载平衡器):它是一个连接到负载平衡器服务器的客户端,用于广播消息并获取有关服务器的信息。

Enabled:如果启用,它将连接到负载平衡器服务器。

Host:负载平衡器服务器主机。

Port:连接端口

Servers:在这里,您可以设置手动WebSocket服务器进行连接(如果您不使用负载平衡器服务器获取服务器连接方法),例如:

http://127.0.0.1:80

http://127.0.0.2:8888


Connected:如果连接处于活动状态,则返回true。小心使用此属性,因为使用内部“connected”Indy方法,并且此方法可能会锁定线程和/或增加cpu的使用。如果您想知道客户端是否已连接,只需使用Active属性即可,这样更安全。


ReadTimeout:读取消息的最长时间(毫秒)。


WriteTimeOut:将数据发送到其他对等端的最长时间(以毫秒为单位),默认为0(仅适用于Windows操作系统)。


BoundPortMin:客户端使用的最小本地端口,默认为零(表示没有限制)。


BoundPortMax:客户端使用的最大本地端口,默认为零(表示没有限制)。


Port:用于连接到主机的端口。


LogFile:如果启用,则将套接字消息保存到指定的日志文件,这对于调试非常有用。如果从多个线程访问日志文件,则该文件的访问不是线程安全的。

Enabled:如果每次通过套接字接收和发送消息时都启用,则消息将保存在文件中。

FileName:文件名的完整路径

UnMaskFrames:默认情况下,True表示保存未屏蔽发送的websocket消息。


NotifyEvents:定义通知WebSocket事件的模式。

neAsynchronous:这是默认模式,在异步模式下通知线程事件,将事件添加到与主线程异步同步的队列中。

neSynchronous:如果选择此模式,则在同步模式下通知线程事件,需要与主线程同步以通知这些事件。

neNoSync:与主线程没有同步,如果需要访问非线程安全的控件,则需要实现自己的同步方法。


Options:允许自定义握手时发送的标头。

FragmentedMessages:允许处理碎片消息

    -frgOnlyBuffer:消息被缓冲,直到接收到所有数据,它引发OnBinary或OnMessage事件(默认选项)

    -frgOnlyFragmented:每次接收到新片段时,它都会引发OnFragmented事件。

    -frgAll:每次接收到新片段时,它都会引发OnFragmented Event,其中包含从第一个数据包接收到的所有数据。当接收到所有数据时,它会引发OnBinary或OnMessage事件。

Parameters:定义GET上使用的参数。

Origin:自定义连接原点。

RaiseDisconnectExceptions:默认情况下启用,每次发生协议错误导致的断开连接时都会引发异常。\

ValidateUTF8:如果启用,则验证消息是否包含UTF8有效字符,默认情况下禁用。

CleanDisconnect:如果启用,则每次客户端断开与服务器的连接时,首先发送消息通知服务器连接将关闭。


QueueOptions:

该属性允许在内部队列中对消息进行排队(而不是直接发送),并在连接线程的上下文中发送消息,这防止了在多个线程尝试发送消息时发生锁定。对于每种消息类型:文本、二进制或Ping,都可以配置队列,

默认情况下,值集为qmNone,这意味着消息不排队。其他类型表示不同的队列级别,它们之间的区别只是处理顺序(首先是qmLevel1,然后是qmLevel2,最后是qmLevel3)。

示例:如果文本和二进制消息的属性设置为qmLevel2,Ping设置为qmLevel1。客户端将首先处理Ping消息(因此,如果文本或二进制消息在同一时间排队,则会先发送Ping消息),然后在同一队列中处理文本和二进制信息。


Extensions:您可以对发送的邮件启用压缩。


Protocol:如果存在,则显示当前使用的协议


Proxy:在这里,您可以定义如果要通过代理服务器进行连接,则可以连接到以下代理服务器

pxyHTTP,pxySocks4,pxySocks4A,pxySocks5


WatchDog:如果启用,当检测到意外断开连接时,将尝试自动重新连接到服务器。

Interval:X秒后重新连接。

Attempts:最大重新连接次数,如果为零,则无限制。


Throttle:用于限制每秒发送/接收的比特数。


TLS:启用安全连接。


TLSOptions:如果启用TLS,您可以在这里自定义一些TLS属性。

ALPNProtocols:将发送到服务器的ALPN协议列表。

RootCertFile:根证书文件的路径。

CertFile:证书文件的路径。

KeyFile:证书密钥文件的路径。

Password:如果证书使用密码保护,请在此处设置。

VerifyCertificate:如果必须验证证书,请启用此属性。

VerifyDepth:是Integer属性,表示对X.509证书执行验证时允许的最大链接数。

Version:默认情况下,从较新到较低协商所有可能的TLS版本。可以选择特定的TLS版本。

    -tlsUndefined:这是默认值,客户端将尝试协商所有可能的TLS版本(从最新到最旧),直到成功连接。

    -tls1_0:实现TLS 1.0

    -tls1_1:实现TLS 1.1

    -tls1_2:实现TLS 1.2

    -tls1_3:实现TLS 1.3

IOHandler:选择要使用TLS连接的库。

    -iohOpenSSL:使用OpenSSL库,是Indy组件的默认库。需要部署openssl库(可以从注册客户的私人帐户下载)。

    -iohSChannel:使用Microsoft for Windows实现的安全协议Secure Channel,不需要部署openssl库。仅适用于Windows 32/64位。

OpenSSL_Options:openSSL库的配置。

    -APIVersion:允许定义将使用哪个OpenSSL API。

        --oslAPI_1_0:使用API 1.0 OpenSSL,它是Indy最新支持的

        --oslAPI_1_1:使用API 1.1 OpenSSL,需要我们的自定义Indy库,并允许使用OpenSSL 1.1.1库(支持TLS 1.3)。

        --oslAPI_3_0:使用API 3.0 OpenSSL,需要我们的自定义Indy库,并允许使用OpenSSL 3.0.0库(支持TLS 1.3)。

    -LibPath:在这里,您可以配置openSSL库的位置

        --oslpNone:这是默认设置,openSSL库应位于二进制文件所在的同一文件夹中或位于已知路径中。

        --oslpDefaultFolder:为所有IDE角色自动设置库应位于的openSSL路径。

        --oslpCustomFolder:如果选择了此选项,请在LibPathCustom属性中定义完整路径。

    -LibPathCustom:当LibPath=oslpCustomFolder时,在此处定义openSSL库所在的完整路径。

    -UnixSymLinks:启用或禁用Unix系统下SymLinks的加载(默认情况下已启用,OSX64下除外)

        --oslsSymLinksDefault:默认情况下,除了在OSX64下(在MacOSMonterey尝试加载没有版本的库失败之后)。

        --oslsSymLinksLoadFirst:加载SymLinks并在尝试加载版本库之前执行。

        --oslsSymLinksLoad:尝试加载版本库后加载SymLinks。

        --oslsSymLinksDontLoad:不要加载SymLinks。

    -SChannel_Options:允许使用Windows证书存储中的证书。

        --CertHash:是证书哈希。您可以在powershell中找到运行dir命令的证书哈希。

        --CipherList:在这里,您可以设置要使用的密码(用“:”分隔)。示例:CALG_AES_256:CALG_AES_128

        --CertStoreName:存储证书的存储名称。选择以下选项之一:

            ---scsnMY (默认值)

            ---scsnCA

            ---scsnRoot

            ---scsnTrust

        --CertStorePath:存储证书的存储路径。选择以下选项之一:

            ---scspStoreCurrentUser (默认值

            ---scspStoreLocalMachine







浏览27 评论0
返回
目录
返回
首页
传奇A版LUA脚本例子 TsgcWebSocketServer

发表评论