websocket建立连接时能传递参数吗

websocket建立连接时能传递参数吗,第1张

可以传参,以java为例

html中:

var websocket = new WebSocket("ws://ws.xxxx.con/what/webSocketServer?sid=" + sid)

java中自定义 WebSocketHandshakeInterceptor, 在 beforeHandshake 方法中使用

String sid = ((ServletServerHttpRequest) req).getServletRequest().getParameter("sid")

即可拿到 sid 的值,可以添加到 attributes 中使用

在 WebSocketHandler  的方法中,通过 

session.getAttributes().get('sid')

可以拿到建立时传递的参数

最近在用 Workerman 学习 WebSocket 的时候,遇到了一个问题:

结果浏览器报了这个错:

查阅了 RFC文档 得知问题在于新建WebSocket时的第二个参数,表示客户端接受的子协议

子协议是什么?比如浏览器向服务端发起两个WebSocket连接,一条连接使用明文传输数据,另一条使用加密传输数据。

服务端可以开启两个端口分别处理明文和加密连接。也可以只开一个端口,通过客户端提供的子协议来判断该连接传输数据的方式。

那么新建WebSocket时的子协议参数,最终是以什么形式发送到服务端的?就藏在请求Header的 Sec-Websocket-Protocol 中:

服务端接收到 Sec-Websocket-Protocol 后,必须在响应 Header 中也包含 Sec-Websocket-Protocol ,取值和客户端传来的一样。否则浏览器就会报错: Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was receive

再提一点,子协议参数可以是个数组,比如:

表示该WebSocket连接既接收字符格式的数据,也可以接收JSON格式的数据,这时服务端必须在两者中选择其一返回给浏览器。

有点扯远了,今天的主角是 Workerman。Workerman 要获得子协议参数,需要在 onConnect 回调中设置 onWebSocketConnect 回调:

然后通过 $_SERVER['HTTP_SEC_WEBSOCKET_PROTOCOL'] 获得浏览器发来的子协议参数,是个字符串。如果浏览器接受多个子协议,那么协议之间会以 逗号 分隔。方便起见,例子中总是返回第一种子协议。

服务端响应时,将 Sec-Websocket-Protocol 字段放入 $connection->headers 数组中,这样就完成了子协议的协商。

可以传参。

以java为例:

html中:

var websocket = new WebSocket("ws://ws.xxxx.con/what/webSocketServer?sid=" + sid

java中自定义 WebSocketHandshakeInterceptor, 

在 beforeHandshake 方法中

String sid = ((ServletServerHttpRequest) req).getServletRequest().getParameter("sid")

即可拿到 sid 的值,可以添加到 attributes 中使用

在 WebSocketHandler  的方法中

通过

session.getAttributes().get('sid')

可以拿到建立时传递的参数

WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是:

WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样;

WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11558355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存