Socket.io和Websocket在同一台服务器上侦听
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
添加到选项中(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
我根本不需要改变插座的侧面。
- 通过开机自检将 XML 发送到另一台服务器
- 将页面正文发送到另一台服务器
- 从另一台服务器安全地从JS发送到PHP
- Web应用程序的体系结构/设计,对另一台服务器进行了大量Ajax调用
- 将 mp3 文件从另一台服务器下载到我的服务器
- PDF.js:从另一台服务器读取文件
- 当本地主机服务器提供实际页面时,如何使用 socket.io 与另一台服务器通信
- 如何在一台服务器中运行不同的.js文件.js NODE JS中的文件
- 如何使用JavaScript或jQuery从另一台服务器解析XML
- 从另一台服务器获取node.js中的服务映像
- 正在将大型文件从nodejs上载到另一台服务器
- 如何使用AJAX从另一台服务器获取时间
- 它能在JavaScript选项runat=“”中从另一台服务器调用js文件吗;服务器”;
- Jcrop在特定服务器上的IE8下失败,在另一台服务器上工作
- 插件加载程序(如果一台服务器出现故障)
- HTML从另一台服务器发送和接收数据
- 执行另一台服务器上的脚本
- MUP将失败部署到在另一台服务器上工作的项目上
- Codeigniter从另一台服务器加载页面
- 如何从不同服务器上的用户界面(网页)调用一台服务器上的API