Node.js websocket客户端到socket.io

Node.js websocket客户端到socket.io,node.js,websocket,socket.io,Node.js,Websocket,Socket.io,我需要一个服务器能够接受来自websocket和socket.io客户端的连接,这可能吗?当我只运行socket.io时,socket.io客户端也可以正常工作,但标准websocket客户端无法连接。另一方面,当我在socket.io旁边运行websocket服务器时,websocket工作正常,但在试图通过socket.io连接的浏览器中,我看到错误websocket连接到。。。失败:帧头无效。是否可以使两个连接都在单个服务器实例上工作 我正在使用and,如果它只与express.oi一起工

我需要一个服务器能够接受来自websocket和socket.io客户端的连接,这可能吗?当我只运行socket.io时,socket.io客户端也可以正常工作,但标准websocket客户端无法连接。另一方面,当我在socket.io旁边运行websocket服务器时,websocket工作正常,但在试图通过socket.io连接的浏览器中,我看到错误
websocket连接到。。。失败:帧头无效
。是否可以使两个连接都在单个服务器实例上工作


我正在使用and,如果它只与express.oi一起工作就太好了。

虽然@jfriend00正确地认为socket.io是webSocket之上的附加协议,但我发现附加协议可能非常简单。我想是插座。io@2.0.3服务器隐式运行一个WebSocket服务器,由,我设法(在F12/networktool的帮助下)用一个原生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.

IO API更抽象,它处理事件和参数,而WebSocket API处理字符串。

为什么需要这样做?socket.io是webSocket之上的附加协议,因此不能使用相同的服务器端代码同时侦听普通webSocket和socket.io连接。最简单的方法是将两个连接中的一个放在不同的端口上,并对每个端口使用不同的处理程序,让每个端口的标准库处理它们的构建目的('42'…?是不是因为什么原因需要
42
。@Mobilpadde是的,我认为这个数字是某种消息类型。如果我没记错的话,至少还有另一个数字,用于“探测”消息。@Mobilpadde你可以自己看到它:在Chrome中打开,在F12>网络中,用“EIO=3&transport=websocket”过滤,应该有一些,响应头应该包含“Connection:upgrade”,详细信息面板中应该有“Frames”选项卡,而不是普通HTTP请求的“Preview”和“response”选项卡。“Frames”选项卡中列出的内容非常直观,例如“2probe”、“42[“login”、{numUsers:10}]我认为浏览器支持的是websocket,也就是说,升级的HTTP,而不是Socket.IO.42是所有问题的答案