使用'ws'包从Node.js服务器连接到socket.io服务器

时间:2018-04-26 08:06:14

标签: node.js sockets websocket socket.io

我有一个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

2 个答案:

答案 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扩展,所以也有不同的变化。如果它不起作用,请尝试这些

  • x-webkit-deflate-frame
  • perframe-DEFLATE

作为免责声明,此信息来自我所做的研究。我不是“socket.io专家”所以,如果有任何不正确的请评论,我将编辑帖子。