我有一个Node.js服务器,它利用流行的String(
包来使用网络套接字。我想使用这个库连接到运行socket.io的第三方服务器。
如果我在我的服务器上使用socket.io,连接代码将是这样的:
ws
我尝试使用const socket = socketIo('https://api.example.com/1.0/scores')
包连接到同一服务,并修改网址:
ws
但这导致以下结果:
错误:意外的服务器响应:200
问题:
从运行const wsClient = new WebSocket('wss://api.example.com/1.0/scores');
包的服务器连接到运行socket.io的第三方服务器需要做什么?
其他信息:
ws
到网址的末尾。这个
不会抛出与上面相同的错误(/socket.io/?EIO=3&transport=websocket
),也不会抛出任何可见的错误,但似乎没有
工作(没有从远程服务器收到数据)。使用> Error: Unexpected server
response: 200
打开连接(通过new WebSocket('ws://api.example.com/1.0/scores?EIO=3&transport=websocket');
)会产生以下堆栈跟踪:
ws
答案 0 :(得分:0)
因为Socket.IO并不能保证会像您一样托管WebSockets服务器,所以您应该使用他们的标准客户端软件包。
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"protocol": "inspector",
"name": "Attach by Process ID",
"processId": "${command:PickProcess}"
},
{
"type": "node",
"request": "attach",
"protocol": "inspector",
"name": "Attach",
"port": 9229
},
{
"type": "node",
"request": "launch",
"port":9230,
"name": "Launch Program",
"program": "${workspaceFolder}\\bin\\www"
}
]
}
然后在代码中使用该包:
npm i socket.io-client
socket.io-client的完整文档可在GitHub repo上找到。
注意:老实说,如果可能的话,现在使用WebSockets会更好。 WebSockets在浏览器中得到了很好的支持,非常标准。 Socket.IO很少是必需的,而且体积很大。
答案 1 :(得分:0)
socket.io api使用websockets,但它还有许多其他功能构建在它之上,以便做一些事情,比如HTTP握手,会话ID,甚至可以在需要时处理其他协议的故障转移。
到目前为止你有一半的问题。添加行socket.io/?EIO=3&transport=websocket
,您要为socket.io服务器指定参数。
EIO=3
指定socket.io正在使用的engine.io的版本号。在这种情况下,您说的是engine.io version = 3
transport=websocket
指定要使用的传输协议。正如我之前所说,socket.io在故障转移等情况下使用其他协议。这部分强制socket.io使用websocket作为首选协议。
现在下一半是WebSocket。 WebSocket允许扩展,其中包括发送数据时常用的各种压缩。我认为是导致Parse Error
试试这个(found here):
const WebSocket = require('ws');
const ws = new WebSocket('ws://server/socket.io/?EIO=3&transport=websocket', {
perMessageDeflate: false
});
通过设置perMessageDeflate:false,您指定“不压缩数据”。因为我说这是一个WebSocket扩展,所以也有不同的变化。如果它不起作用,请尝试这些
作为免责声明,此信息来自我所做的研究。我不是“socket.io专家”所以,如果有任何不正确的请评论,我将编辑帖子。