【问题标题】:websocket client to socket.iowebsocket客户端到socket.io
【发布时间】:2015-06-18 17:14:39
【问题描述】:

我需要一个服务器来接受来自 websocket 和 socket.io 客户端的连接,这可能吗?当我只运行 socket.io 时,socket.io 客户端也可以正常工作,但标准 websocket 客户端无法连接。另一方面,当我在 socket.io 旁边运行 websocket 服务器时,websocket 运行良好,但在尝试通过 socket.io 连接的浏览器中,我看到错误 WebSocket connection to ... failed: Invalid frame header。是否可以让两个连接在单个服务器实例上工作?

我正在使用 express.iowebsocket-node,如果它只与 express.oi 一起使用会很棒。

【问题讨论】:

  • 为什么需要这样做? socket.io 是 webSocket 之上的附加协议,因此您不能使用相同的服务器端代码来监听普通 webSocket 和 socket.io 连接。将两个连接中的一个放在不同的端口上并为每个连接使用不同的处理程序是最简单的,让每个连接的标准库处理它们的构建目标。

标签: node.js websocket socket.io


【解决方案1】:

虽然@jfriend00 说socket.io 是webSocket 之上的附加协议是正确的,但我发现附加协议可能非常简单。我认为 socket.io@2.0.3 服务器隐式运行由ws@2.3.1 驱动的 WebSocket 服务器,我设法(在 F12/network 工具的帮助下)使用本机 WebSocket 客户端连接到它。

socket.io 客户端:

var socket = io('http://localhost');
socket.emit('hello', 'there');

websocket 客户端:

var ws = new WebSocket('ws://localhost/socket.io/?EIO=3&transport=websocket');
ws.send('42' + JSON.stringify(['hello', 'there']));
// ws.onmessage will get a MessageEvent object with the data property being encoded in the similar way.

Socket.IO API 比较抽象,处理事件和参数,而 WebSocket API 处理字符串。

【讨论】:

  • ws.send('42'... 怎么了?是否出于任何原因需要42
  • @Mobilpadde 是的,我认为这个数字是某种消息类型。如果我没记错的话,至少还有一个数字,用于“探测”消息。
  • @Mobilpadde 自己看:在Chrome中打开socket.io/demos/chat,在F12>网络中,用“EIO=3&transport=websocket”过滤,应该有一些,响应头应该包含“连接:升级”,并且在详细面板中应该有“框架”选项卡,而不是普通 HTTP 请求的“预览”和“响应”选项卡。 “Frames”选项卡中列出的内容非常直观,例如'2probe'、'42["login"、{numUsers: 10}]'。我认为这里浏览器支持的是websocket,即升级后的HTTP,而不是Socket.IO。
  • 42 是一切的答案
猜你喜欢
  • 1970-01-01
  • 2023-01-04
  • 1970-01-01
  • 2018-04-11
  • 2015-08-29
  • 2015-05-01
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多