WebSocket 发送有关连接的额外信息

Posted

技术标签:

【中文标题】WebSocket 发送有关连接的额外信息【英文标题】:WebSocket send extra information on connection 【发布时间】:2013-10-19 02:02:25 【问题描述】:

有没有办法让 WebSocket 客户端向 WebSocket 服务器发送有关初始连接的附加信息?

我问是因为我希望客户端立即将用户 ID(字符串)发送到服务器。我不希望客户端在 onopen 回调中发送用户 ID。为什么?因为它更快更简单。

如果 WebSocket API 不允许您这样做,为什么不呢?如果没有充分的理由,我怎么能建议他们添加这个简单的功能?

【问题讨论】:

它是一个 url,你有整个 queryString 供你使用... 【参考方案1】:

更新答案

@dandavis 是个天才。他对在 WebSocket 构造函数的第一个(url)参数的查询字符串中发送用户 ID 的问题的评论有效!而且,我很确定它只在opening handshake (1.3) of the WebSocket protocol (RFC 6455) 期间由客户端发送一次。

它甚至可以在路径中发送它,我现在更喜欢这种方式,因为我制作的 WebSocket 服务器仅用于 WebSockets。我正在使用Node.js 和ws。我正在连接到 URL ws://localhost:5000/4,其中 4 是用户 ID。要获取用户 ID,我会使用 ws.upgradeReq.url,如下所示:

wss.on('connection', function(ws) 
    console.log(ws.upgradeReq.url); # => '/4'
);

接下来,为了确保安全,我将传递访问令牌而不是用户 ID。

原答案

您可以将用户 ID(字符串)作为 WebSocket constructor 的第二个(协议)参数传递。

这应该可行,但它并不适合您想要的。这绝对是一个黑客。所以,我不推荐它。此外,服务器将在其握手中将用户 ID 回显给客户端。而且,你不需要那个。那将是通过网络发送的额外数据,对您没有用处。

我不确定为什么 WebSocket API 不能让你做你想做的事。也许这样更安全。

【讨论】:

你不应该知道 OP 想要什么吗? (忘记更改登录名?) 嗯,那时的我和现在的我是不同的人。时代变迁。我和他们一起改变。 ;-) 一直在学习。不断发展。 您可以使用路径或查询组件,但不能在 WS URI 中使用片段标识符。您不应该使用 WS 子协议。这不仅是一种黑客行为,而且会以多种方式破坏事物。您还可以使用 HTTP 自定义标头或 cookie。【参考方案2】:

由于 v3 ws.upgradeReq 已被弃用并且不再工作。

您现在可以使用:

wss.on('connection', function(ws, req) 
    console.log(req.url); # => '/4'
);

来源:https://github.com/websockets/ws#client-authentication

【讨论】:

很高兴知道。谢谢! :-)

以上是关于WebSocket 发送有关连接的额外信息的主要内容,如果未能解决你的问题,请参考以下文章

前端webSocket基础应用

websocket实战 信息处理发送接收和编码

Swoole入门 - WebSocket 服务

http和WebSocket

HTTP 和 WebSocket的区别

Web-Socket