API SocketIO

SocketIO

 

Socket.IO 是一个用于实时 Web 应用程序的 JavaScript 库。它实现了 Web 客户端和服务器之间实时、双向的通信。它由两部分组成:在浏览器中运行的客户端库,以及用于 Node.js 的服务器端库。两个组件具有几乎相同的 API。与 Node.js 一样,它是事件驱动的。

 

消息类型

 

0:打开(当新传输打开时由服务器发送(重新检查))

 

1:关闭(请求关闭此传输,但不终止连接本身。)

 

2:ping(由客户端发送。服务器应以包含相同数据的 pong 数据包作答)

示例

客户端发送:2probe

server sends: 3probe

 

3:pong(由服务器发送以响应 ping 数据包。)

 

4:字符串消息(实际消息,客户端和服务器应使用数据调用其回调。)

示例:

42/chat,["join","{room:1}"]

4 是 engine.io 协议中的消息包类型。

2 是 socket.io 协议中的 EVENT 类型

/chat 是由 socket.io 处理的数据

socket.io 将触发 "join" 事件

将传递 "room: 1" 数据。仅当命名空间为 / 时,可以省略命名空间。

 

5: 升级(在 engine.io 切换传输之前,它会测试服务器和客户端是否可以通过该传输进行通信。若测试成功,客户端将发送升级数据包,请求服务器刷新旧传输上的缓存并切换到新传输。)

 

6:noop(空操作包。主要用于在收到新的 WebSocket 连接时强制触发轮询周期。)

 

属性

API:指定 SocketIO 版本:

 

ioAPI0:支持 socket.io 0.* 服务器(默认选中)

 

ioAPI1:支持 socket.io 1.* 服务器

 

ioAPI2:支持 socket.io 2.* 服务器

 

ioAPI3:支持 socket.io 3.* 服务器

 

ioAPI4:支持 socket.io 4.* 服务器

 

Base64:若启用,二进制消息将以 base64 格式接收。

 

HandShakeCustomURL:允许自定义用于获取 socket.io 会话的 URL。

 

HandShakeTimestamp: 仅在需要将时间戳作为参数随新会话请求一同发送时启用此项(若尝试访问 gevent-socketio Python 服务器,请启用此属性)。

 

HandShakeAuthToken:如果服务器需要身份验证令牌,请在此处设置身份验证令牌。

 

命名空间:允许在连接到服务器时设置命名空间。

 

轮询:禁用此属性后,客户端将直接使用 WebSocket 作为传输方式连接到服务器。

 

Parameters:允许设置连接参数。

 

EncodeParameters:如果启用,则对参数进行编码。

 

方法

使用 WriteData 方法向 socket.io 服务器发送消息(请参阅消息类型部分)。

1. 使用 John 作为用户名,调用方法"add user"并传入一个参数。


WriteData('42["add user", "John"]');

事件

OnHTTPRequest

在建立新的 WebSocket 连接之前,socket.io 服务器要求客户端打开一个新的 HTTP 连接以获取新的会话 ID。在某些情况下,socket.io 服务器需要使用 HTTP 标头进行身份验证。您可以使用此事件添加自定义 HTTP 标头,例如 Basic 授权或 Bearer 令牌认证。

OnAfterConnect

socket.io 连接成功且客户端可以向服务器发送消息后调用此事件。例如,您可以在此处订阅命名空间。

OnHTTPConnectionSSL

当 WebSocket 服务器需要安全连接时,若客户端尝试连接该服务器,您可能会收到如下错误消息:

Error connecting with SSL. error:XXXXXXXX:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version

此错误表示您的客户端正尝试使用服务器不支持的 TLS 版本进行连接。

要解决此错误,您必须处理 WebSocket 客户端组件的 OnSSLAfterCreateHandler 事件,并设置更新的 TLS 版本。

例如:此处我们将 TLS 1.2 设置为协议版本。


procedure TfrmWebSocketClient.SOCKETIOHTTPConnectionSSL(Sender: TObject;
    aSSLHandler: TIdSSLIOHandlerSocketBase);
begin
  TIdSSLIOHandlerSocketOpenSSL(aSSLHandler).SSLOptions.Method := sslvTLSv1_2;
end;