### 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     | 通     |

应用示例：


```javascript
//服务端启用
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();
```


```javascript
//服务端启用
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();
```



