nodejs-websocket 检测非 websocket 连接尝试

nodejs-websocket detect non-websocket connection attempt

我是 运行 使用 nodejs-websocket 模块的 websocket 服务。

我想检测未使用 websocket 协议的连接尝试并采取一些措施。

我想过使用 setTimeout(n) 并在 conn.readystate 从 'connecting' 变为 'open' 时清除超时,或者在计时器到期时采取行动,但我希望有更直接的方法。

如何检测非 websocket 连接尝试?

连接有一个错误事件,所以你可以Connection.on('error', function(err) ...。这将意味着连接出现问题,但我认为此时您无法对连接进行任何操作。

一个建议是使用 Socket.io,它可以在 HTTP/Connect/Express 服务器上聚会。它可以使用 HTTP(Kinda) 或 WebSockets。然后你可以这样做:

var app = require('express')();
var server = require('http')
  .Server(app);
var io = require('socket.io')(server);

server.listen(3000);

app.get('/*', function(req, res) {
  res.json({
    hello: 'world'
  });
});

io.on('connection', function(socket) {
  socket.emit('news', {
    hello: 'world'
  });
  socket.on('my other event', function(data) {
    console.log(data);
  });
});

/Socket.io/* 路径下有所有 Socket.io 连接。 app.get('/*',...) 调用将处理任何其他连接。这只会捕获 http 请求。

webocket 协议通过 HTTP 请求启动每个连接,header 设置 "requests" 对 webSocket 协议的升级。当服务器双方都同意时,它会响应升级,然后客户端和服务器都将协议更改为 webSocket 协议。

因此,non-webSocket 连接尝试要么是纯 HTTP 连接,要么只是套接字连接尝试,甚至不是 HTTP。因此,无论哪种情况,连接都将在 HTTP 服务器上以 404(Web 服务器没有响应的 HTTP 请求)或无效协议(不是 HTTP)的形式终止。