Socket.io和Websocket在同一服务器上监听。

3
我需要在socket.io和websocket(来自“ws”包)处理程序之间共享相同的HTTP服务器。不幸的是,尽管它们正在监听不同的前缀,但第一个正在监听/ socket.io,第二个正在监听/websocket url,但由于某些原因,如果它们在同一台服务器上运行,则websocket无法正常工作。
我进行了一些调试,但似乎请求都被两个库正确处理,但最终只有socket.io可以正常工作。
您有解决方法吗?

你为什么要同时使用两个? - Blender
依赖关系的复杂性和客户端类型。 - Luman75
3个回答

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

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


谢谢,我一分钟前就解决了。你整天都在哪里呀 :) - Luman75
@Luman75 这里是上午。我刚刚组装了一个类似的服务器设置,如果您有更多问题,请随时联系我。 - Aaron Dufour
再次感谢,我正在将ShareJS集成到WebSocket和Socket.IO客户端的一个环境中。我希望避免在多个端口上进行监听。 - Luman75

0

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方面的任何内容。


0

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

对于来自非SocketIO客户端的升级请求,有一个“destroy upgrade”选项。由于Websocket(模块'ws')正在使用相同的请求,其中一些可能是针对'ws'而不是'socket.io'的。因此,应禁用此选项。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接