【问题标题】:nodejs-websocket detect non-websocket connection attemptnodejs-websocket 检测非 websocket 连接尝试
【发布时间】:2015-07-06 03:35:54
【问题描述】:

我正在使用 nodejs-websocket 模块运行 websocket 服务。

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

我考虑过使用 setTimeout(n) 并在 conn.readystate 从“正在连接”变为“打开”或在计时器到期时采取行动时清除超时,但我希望有更直接的方法.

如何检测非 websocket 连接尝试?

【问题讨论】:

    标签: node.js websocket


    【解决方案1】:

    websocket 协议以 HTTP 请求开始每个连接,该请求带有一个“请求”升级到 webSocket 协议的标头集。当服务器都同意时,它会响应升级,然后客户端和服务器都将协议更改为 webSocket 协议。

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

    【讨论】:

    • 感谢您的回答。我宁愿一个不需要单独的网络服务器来满足我的要求的解决方案,但你说的是正确的。
    • @RoyHB - 如果没有至少一个能够响应 HTTP 请求的准系统服务器,您将无法检测到传入的 webSocket 连接(和非 webSocket 请求),因为每个 webSocket 请求都以 HTTP 请求开始。因此,如果没有最基本的 HTTP 服务器,您将无法接受传入的 webSocket 请求。如果 nodejs-webSocket 支持传入的 webSocket 请求,那么它已经是一个 HTTP 服务器。
    【解决方案2】:

    Connection 有一个错误事件,所以你可以做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请求。

    【讨论】:

    • 非 webSocket 连接永远不会到达 socket.io,因此您将无法使用 socket.io 的错误处理。实际发生的情况取决于非 webSocket 连接实际上是哪种连接。
    • 是的,你完全正确。 Engine.io(运行 Socket.io 的东西)消耗所有请求并且它永远不会命中 Express。您可以通过 DEBUG=* 看到这一点。理论上你可以插入底层的 Engine.io 框架,但它们并没有明确说明如何。我尝试了一些简单的事情,但没有任何效果。我的回答可能对你不起作用。您可能需要根据请求的格式实现/找到一些东西来处理请求。
    猜你喜欢
    • 2016-05-31
    • 2017-04-14
    • 2015-09-23
    • 2016-05-15
    • 2017-02-20
    • 2020-04-16
    • 2013-02-02
    • 1970-01-01
    • 2013-07-07
    相关资源
    最近更新 更多