0

我正在使用ws webSocket(不能使用 socket.io),我对它有点陌生。我知道它是如何工作的,但不完全了解一些事情。

  1. 如何使用 jwt 进行身份验证?文档说使用事件是正确的upgrade方法,但是当客户端连接时,upgrade函数中的代码没有运行。

  2. 添加事件类型的正确方法是什么?在 socket.io 中,可以使用client.on('eventType', function). 什么是 webSocket ws 等价物?

  3. 何时以及为什么会在 webSocket ws 中使用路径?

更新

更新事件不会在我这边被触发。这是我的代码:

文件 1

const server = require('http').createServer(app);
require('./socket/socket')(server);

文件 2

module.exports = function(server) {
    const WebSocket = require('ws');

    const wss = new WebSocket.Server({ port: 8080 });

    server.on('upgrade', function(request, socket, head) {
        console.log('Upgraded');

        wss.handleUpgrade(request, socket, head, function(ws) {
            wss.emit('connection', ws, request);
        });
    });

    wss.on('connection', function connection(ws) {
        ws.on('message', function incoming(message) {
            console.log('received: %s', message);
        });
    });
};
4

2 回答 2

0

如何使用 jwt 进行身份验证?文档说使用升级事件是正确的方法,但是当客户端连接时,升级功能中的代码没有运行。

嗯,有很多不同的选择。首次建立连接时,您可以将令牌作为自定义标头的查询参数传递。您可以要求通过 webSocket 发送的第一个数据是一个令牌,如果这样的令牌没有很快到达,则断开连接。如果客户端已经过身份验证并且有一个 http cookie 表明这一点,您可以在 websocket 连接时检查该 cookie。

添加事件类型的正确方法是什么?在 socket.io 中,可以使用 client.on('eventType', function) 进行监听。什么是 webSocket ws 等价物?

socket.io 消息类型(或您称之为事件类型)是 socket.io 在 webSocket 之上添加的东西。webSocket 协议本身没有这种东西。您发送一个数据包,该数据包到达另一端。所有数据包都是相同的 webSocket“类型”。如果您想将您的数据包识别为某种类型的消息,那么您必须发明一种方法来在您的数据中执行此操作。例如,如果您的数据是 JSON 格式的,您可以type: "someType"向事件消息添加一个属性,然后在收到时检查该属性(这实际上是 socket.io 所做的,尽管它是在 socket.io 有效负载之外执行的)。

何时以及为什么会在 webSocket ws 中使用路径?

您可能有两个完全独立的代码部分,它们将 webSocket 用于不同的东西,它们没有任何共同之处并且驻留在单独的模块中,并且每个部分都有自己的 webSocket 连接更简单。而且,它们可能被两种完全不同类型的客户端使用。

当 webSocket 客户端连接到您的服务器时,如何访问原始 URL 显示与库一起使用的服务器upgrade事件中。ws

您将在该示例中注意到upgrade事件发生在 http 服务器上,而不是 websocket 服务器实例上。

于 2020-01-19T07:34:03.057 回答
0
  1. ws 提供认证示例。这些在 HTTP 服务器第一次处理身份验证请求时起作用。然后将 HTTP 升级请求传递给 ws,而不是 ws 自己监听一个端口。请注意noServer: true它们包含在设置中的选项:

    const wss = new WebSocket.Server({ clientTracking: false, noServer: true });
    

    jwt 组件将更容易使用koa或先在 HTTP 中表达,然后以这种方式进行升级。否则,您将需要编写一个 wsmessage处理程序来查找一些令牌数据并对其进行验证。

  2. message是ws中事件。您可以在事件之上编写任何更具体的内容message,这是使用 socket.io 的一个重要原因,它已经为您完成了所有这些工作(包括客户端回调函数,它们非常有用)。

  3. 在或 http 升级请求中使用 URI 路径ws://通常是连接到ws服务器端的单独上下文。一种将命名空间或连接分隔成离散组的简单方法。

于 2020-01-19T05:55:39.287 回答