繁体   English   中英

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

[英]Socket.io and Webscocket listen on the same server

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

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

知道如何解决吗?

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

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

您还需要在客户端连接时检查url(在代码处理/websocket ),如果它看起来似乎属于socket.io ,则将其忽略。 您可以从客户端对象(传入到on connection处理程序中)找到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模块ws分配了一条路径来成功(使用Express):

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM