Socket.D v2.5.12

了解子协议验证(及开关控制)

</> markdown

1、关于 WebSocket 子协议验证

  • WebSockt 客户端连接时,发送 Sec-WebSocket-Protocol 头信息,表达自己是哪种子协议(也可以理解,只是一个标识)。
  • 服务端则检测是否支持这种子协议,如果不支持则关闭连接,支持则回发头信息 Sec-WebSocket-Protocol
  • 客户端再检测回发的 Sec-WebSocket-Protocol 是否与发送的一致,否则关闭连接。

此过程为 WebSocket 子协议验证

2、sd:ws 的子协议验证

从 v2.5 起,socket.d 默认开始了 WebSocket 子协议验证,协议标识为:"Socket.D"(spring-websocket 下要用小写)。升级时,服务端与客户端须同时升级。 v2.5.10 后,开始支持子协议开关控制:

  • 服务端开启验证时,客户端必须也开启
  • 服务端不验证时,客户端可开启或不开启

对应表:

服务端客户端连接效果
truetrue
truefalse不通
falsetrue
falsefalse

应用示例:

//服务端启用
SocketD.createServer("sd:ws")
        .config(c => c.port(8602).useSubprotocols(true)) //其它语言都有相似的接口
        .start();

//客户端也必须启用
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/?u=a&p=2")
        .config(c => c.useSubprotocols(true))
        .open();
//服务端启用
SocketD.createServer("sd:ws")
        .config(c => c.port(8602).useSubprotocols(false)) //其它语言都有相似的接口
        .start();

//客户端可启用,也可不启用
const clientSession = await SocketD.createClient("sd:ws://127.0.0.1:8602/?u=a&p=2")
        .config(c => c.useSubprotocols(true)) //或者 c.useSubprotocols(false)
        .open();