【问题标题】:Socket.io and Webscocket listen on the same serverSocket.io 和 Webscocket 在同一个服务器上监听
【发布时间】:2013-08-22 09:45:27
【问题描述】:

我需要在 socket.io 和 websocket(来自 'ws' 包)处理程序之间共享相同的 http 服务器。 不幸的是,尽管它们正在监听不同的前缀,但第一个监听的是 /socket.io,第二个监听的是 /websocket url,由于某些原因,如果它们在同一台服务器上运行,则 websocket 无法正常工作。

我做了一些调试,但似乎两个库都正确处理了请求,但最终只有 socket.io 正常工作。

知道怎么解决吗?

【问题讨论】:

  • 你为什么同时使用?
  • 依赖关系和客户端类型的复杂性。

标签: javascript node.js coffeescript websocket socket.io


【解决方案1】:

socket 在 node.js 中的工作方式与普通请求的工作方式有很大不同。没有路由,因此您必须监听所有套接字,而不是监听 url。 socket.io 的默认行为是关闭它无法识别的任何套接字连接。要解决此问题,您需要将标志 'destroy upgrade': false 添加到选项中(server 是快速服务器):

require('socket.io').listen(server, {'destroy upgrade': false, ...})

您还需要在客户端连接时检查 url(在代码处理 /websocket 中),如果它看起来属于 socket.io,则忽略它。您可以从客户端对象(传递给connection 处理程序)中找到网址为client.upgradeReq.url

【讨论】:

  • 谢谢,我在一分钟前就知道了。你整天在哪里:)
  • @Luman75 这里是早上。我只是整理了一个类似的服务器设置,如果您有更多问题,请随时联系我。
  • 再次感谢,我在一个环境中通过 websocket 和 socket.io 客户端集成了 sharejs。我想避免监听多个端口。
【解决方案2】:

好的解决方案很简单(不幸的是调试了半天,现在很简单:))。

对于来自非 socketio 客户端的升级请求,有一个选项“销毁升级”。由于Websocket(模块'ws')使用相同的请求,其中一些可能是针对'ws'而不是针对'socket.io'。所以这个选项应该被禁用。

io = require('socket.io').listen(server,  { log: false, 'resource':'/socket.io'  });
io.disable('destroy upgrade') 

【讨论】:

    【解决方案3】:

    2016 年更新:

    io.disable('destroy upgrade');
    

    似乎不再可用。 但我成功地为 websocket 模块分配了一个路径(使用 Express):

     var wss = new WebSocketServer({ server: server, path: '/ws' }); //do not interfere with socket.io
    

    当然客户端有相同的路径ws://theserver.com/ws

    我根本不需要更改 socket.io 端。

    【讨论】:

      猜你喜欢
      • 2021-02-28
      • 2018-05-13
      • 2017-03-30
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      相关资源
      最近更新 更多