websocket子协议通过构造函数第二个参数声明,支持字符串或字符串数组形式;服务端须在响应头sec-websocket-protocol中返回客户端列表中的某一项,否则ws.protocol为空。

在HTML5的WebSocket API中,子协议(Subprotocol)通过构造函数的第二个参数声明,它是一个字符串或字符串数组,用于协商客户端与服务端共同支持的应用层协议。
基本声明方式
创建WebSocket连接时,直接将子协议名称作为可选参数传入:
- 单个子协议:传入字符串,如
"chat"或"jsonrpc" - 多个候选协议:传入字符串数组,如
["v2.chat.example.com", "v1.chat.example.com"],服务端从中选择一个并返回确认
示例:
const ws = new WebSocket("wss://example.com/chat", "chat");<br>
// 或<br>
const ws = new WebSocket("wss://example.com/api", ["myapp-v2", "myapp-v1"]);
服务端如何响应子协议
子协议是否生效取决于服务端是否在握手响应头中返回 Sec-WebSocket-Protocol,且值必须是客户端所列之一。浏览器会自动校验该字段:
- 若服务端未返回该头,或返回值不在客户端列表中,WebSocket连接仍建立,但
ws.protocol为空字符串 - 若匹配成功,
ws.protocol将返回服务端选定的子协议名,可在连接打开后读取
例如连接后检查:
ws.onopen = () => {<br>
console.log("Negotiated subprotocol:", ws.protocol); // 如输出 "chat"<br>
};
注意事项与常见问题
子协议名无强制格式规范,但应遵循通用惯例:
- 建议使用小写字母、数字、点、连字符组合,避免空格和特殊符号
- 多个子协议按优先级从高到低排列,服务端通常选第一个匹配项
- 浏览器不校验子协议语义,仅做字符串匹配;实际协议行为由应用逻辑保证
- HTTP代理或中间件可能过滤或忽略
Sec-WebSocket-Protocol头,导致协商失败
调试技巧
可通过浏览器开发者工具的“Network”面板查看WebSocket握手请求与响应头:
- 检查请求头中是否有
Sec-WebSocket-Protocol: chat - 检查响应头中是否有同名且值一致的
Sec-WebSocket-Protocol - 若缺失或不匹配,
ws.protocol将为空,需排查服务端配置或代理设置
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










