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

Orb*_*bit 5 sockets websocket node.js socket.io

我有一个Node.js服务器,利用流行的ws软件包来使用网络套接字.我想使用此库连接到运行socket.io的第三方服务器.

如果我在我的服务器上使用socket.io,连接代码将是这样的:

const socket = socketIo('https://api.example.com/1.0/scores')
Run Code Online (Sandbox Code Playgroud)

我试图使用ws包连接到同一服务,并修改网址:

const wsClient = new WebSocket('wss://api.example.com/1.0/scores');
Run Code Online (Sandbox Code Playgroud)

但这导致以下结果:

错误:意外的服务器响应:200

问题: 从运行ws包的服务器连接到运行socket.io的第三方服务器需要做什么?

附加信息:

  • 我在搜索中注意到有些人建议将其附加 /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)在下面的堆栈跟踪结果:

    { Error: Parse Error
        at Socket.socketOnData 
        at emitOne 
        at Socket.emit 
        // ... 
    }
    
    Run Code Online (Sandbox Code Playgroud)

eth*_*non 1

因为 Socket.IO 不保证会有一个像您预期的那样托管的 WebSockets 服务器,所以您应该使用他们的标准客户端包。

npm i socket.io-client
Run Code Online (Sandbox Code Playgroud)

然后在代码中使用该包:

const ioClient = require('socket.io-client')('https://example.com/1.0/scores')
Run Code Online (Sandbox Code Playgroud)

socket.io-client 的完整文档可在其GitHub 存储库上找到。

注意:不过,老实说,如果可能的话,此时最好使用 WebSockets。WebSockets 已在浏览器中得到很好的支持并且相当标准。Socket.IO 很少需要,并且可能会增加一些开销。