14

WebSocket 客户端有没有办法在与 WebSocket 服务器的初始连接上发送附加信息?

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

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

4

2 回答 2

11

更新的答案

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

它甚至可以在路径中发送它,我现在更喜欢它,因为我制作的 WebSocket 服务器仅用于 WebSockets。我将Node.jsws一起使用。我正在连接到 URL ws://localhost:5000/44用户 ID 在哪里。要获取用户 ID,我会这样做ws.upgradeReq.url,如下所示:

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

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

原始答案

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

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

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

于 2013-10-19T02:04:17.407 回答
1

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

您现在可以使用:

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

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

于 2020-04-28T20:02:20.377 回答