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