我正在使用ws webSocket(不能使用socket.io),但是我对此有些陌生。我知道它是如何工作的,但还没有完全掌握。
如何使用jwt进行身份验证? docs说,使用upgrade
事件是正确的处理方法,但是当客户端连接时,upgrade
函数中的代码未运行。
添加事件类型的正确方法是什么?在socket.io中,可以使用client.on('eventType', function)
进行监听。什么是webSocket与之等效?
何时以及为什么要在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);
});
});
};
答案 0 :(得分:0)
ws提供身份验证examples。
这些在HTTP服务器首先处理auth请求时起作用。然后通过
对ws的HTTP升级请求,而不是ws本身在端口上侦听。注意
它们包含在设置中的noServer: true
选项:
const wss = new WebSocket.Server({ clientTracking: false, noServer: true });
在HTTP中使用koa或express将使jwt组件更容易
首先,以这种方式进行升级。否则,您将需要
编写ws message
处理程序以查找一些令牌数据并进行验证。
message
是ws中的 the 事件。您可以在message
事件之上编写更具体的内容,这是使用socket.io能够为您完成所有工作的一个重要原因(包括客户端回调函数,这很有用)。
在ws://
或http升级请求中使用URI路径通常是连接到服务器端的单独ws
上下文。一种简单的命名空间或将连接分成离散组的简单方法。
答案 1 :(得分:0)
如何使用jwt进行身份验证?文档说使用升级事件是解决此问题的正确方法,但是当客户端连接时,升级功能中的代码未运行。
嗯,有很多不同的选择。首次建立连接时,可以将令牌作为自定义标头的查询参数传递。您可能要求通过webSocket发送的第一个数据是一个令牌,如果该令牌没有立即到达,则断开连接。如果客户端已经通过身份验证,并且有一个http cookie指示该身份,则可以在websocket连接后检查该cookie。
添加事件类型的正确方法是什么?在socket.io中,可以使用client.on('eventType',function)进行监听。什么是webSocket与之等效?
socket.io消息类型(或称为事件类型)是socket.io在webSocket之上添加的。 webSocket协议本身没有这样的东西。您发送一个数据包,该数据包到达另一端。所有数据包都具有相同的webSocket“类型”。如果您想将数据包标识为某种消息,则必须发明一种在数据内部进行处理的方法。例如,如果您的数据是JSON格式的,则可以在事件消息中添加type: "someType"
属性,然后在收到消息后检查该属性(这实际上是socket.io所做的,尽管它在socket.io有效负载之外执行) )。
何时以及为什么要在webSocket ws中使用路径?
您可能有两个完全独立的代码部分,它们将webSocket用于不同的事物,这些事物没有共同之处,并且位于单独的模块中,而每个人拥有自己的webSocket连接则更加直接。并且,它们可以由两种完全独立的客户端使用。
在upgrade
库使用的服务器的ws
事件中,here显示了webSocket客户端连接到服务器时如何访问原始URL。
在该示例中,您将注意到upgrade
事件在http服务器上发生,而不在websocket服务器实例上发生。