了解子协议验证(及开关控制)
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 后,开始支持子协议开关控制:
- 服务端开启验证时,客户端必须也开启
- 服务端不验证时,客户端可开启或不开启
对应表:
服务端 | 客户端 | 连接效果 |
---|---|---|
true | true | 通 |
true | false | 不通 |
false | true | 通 |
false | false | 通 |
应用示例:
//服务端启用
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();