我需要在socket.io和websocket(来自"ws"包)处理程序之间共享相同的http服务器。不幸的是,尽管它们正在侦听不同的前缀,但第一个是侦听/socket.io,第二个是侦听/websocket URL,由于某些原因,如果它们在同一台服务器上运行,则websocket无法正常工作。
我做了一些调试,但似乎两个库都能正确处理请求,但最终只有socket.io能正常工作。
知道怎么解决吗?
套接字在node.js中的工作方式与普通请求的工作方式有很大不同。没有路由,所以你必须监听所有的套接字,而不是监听一个url。socket.io
的默认行为是关闭它无法识别的任何套接字连接。要解决此问题,您需要将标志'destroy upgrade': false
添加到选项中(server
是一个express服务器):
require('socket.io').listen(server, {'destroy upgrade': false, ...})
当客户端连接时(在处理/websocket
的代码中),您还需要检查url,如果它看起来属于socket.io
,则忽略它。您可以从客户端对象(传递给connection
上的处理程序)中找到作为client.upgradeReq.url
的url。
Ok解决方案很简单(不幸的是调试了半天,现在很简单:)。
对于来自非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模块分配了一条路径(使用Express):
var wss = new WebSocketServer({ server: server, path: '/ws' }); //do not interfere with socket.io
当然,客户端有相同的路径ws://theserver.com/ws
我根本不需要改变插座的侧面。