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

Socket.io and Webscocket listen on the same server

本文关键字:一台 服务器 io Websocket Socket      更新时间:2023-09-26

我需要在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

我根本不需要改变插座的侧面。