Socket.io和Webscocket在同一台服务器上侦听

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

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

任何想法如何解决?

node.js中的套接字工作方式与正常请求的工作方式有很大不同。 没有路由,所以不要听一个url,你必须听所有的套接字。 socket.io的默认行为是closures任何无法识别的套接字连接。 要解决这个问题,你需要在选项( server是一个快速服务器)上添加标志'destroy upgrade': false

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

当客户端连接时(在代码处理/websocket ),你也需要检查url,如果它看起来像属于socket.io ,就忽略它。 你可以从client.upgradeReq.urlfind客户端对象的URL(传入connection处理程序)。

好的解决scheme很简单(不幸的是半天的debugging,现在很简单:))。

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

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

2016年更新:

 io.disable('destroy upgrade'); 

似乎不可用了。 但我成功地分配了websocket模块的path(使用Express):

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

当然客户端的path是ws://theserver.com/ws

我根本不需要修改socket.io。