我可以使用socket.io-client连接到标准的websocket吗?

时间:2014-03-06 17:43:10

标签: node.js coffeescript websocket socket.io

尝试使用socket.io-client连接到用Go编写的websocket服务器。我已经使用节点WebSocket库(npm)成功连接。所以工作的Websocket代码如下所示:

  goSocketPort = 6060
  url = "ws://localhost:#{goSocketPort}/streamresults/"
  ws = new WebSocket(url)

  ws.on('open', ->
    log "socket opened"
  )

  ws.on('message', (message) ->
      console.log('received: %s', message)
    #log "Socket message: #{JSON.stringify message}"
  )

非常简单且有效 - 另一端的套接字以固定频率发送消息。但我最初尝试使用socket.io-clientnpm)并且无法让它继续下去。它当然将websocket列为首选的传输,但该死的,如果我可以连接它:

socket = ioClient.connect("#{url}", {port: goSocketPort, transports: ['xhr-polling', 'websocket']}) 

socket.on("connect", (r) ->
  log "connected to #{url}"
)

连接永远不会发生,因此没有on个事件被触发,代码会立即退出。我已经尝试过:将端口从网址中删除并将其添加到选项中,不使用传输选项(根据文档意味着“全部”)并使用http网址。 socket-io.client无法连接到“标准”websocket吗?

2 个答案:

答案 0 :(得分:31)

根据我们的聊天情况,您似乎被这句话误导了:

  

socket.io客户端基本上是一个简单的HTTP Socket接口实现。当用户的浏览器不支持WebSocket时,它看起来类似于WebSocket,同时提供附加功能并利用其他传输。

这意味着它从与Socket.io客户端/服务器交互的客户端/服务器代码的角度看起来与WebSocket类似。但是,网络流量看起来与简单的WebSocket非常不同 - 除了在连接之后构建在WebSocket之上的更健壮的协议之外,还有初始握手。握手描述为here,消息协议here(两者都是指向Socket.IO协议规范的链接)。

如果您正在编写WebSocket服务器,那么除非您打算实现所有Socket.io协议,否则最好只使用裸WebSocket接口而不是Socket.io客户端。

答案 1 :(得分:1)

不确定当时是否是这种情况,但是socket.io的网站现在直接在文档中说明了这一点。

尽管Socket.IO确实在可能的情况下使用WebSocket作为传输方式, 它将附加的元数据添加到每个数据包。这就是为什么WebSocket 客户端将无法成功连接到Socket.IO服务器, 并且Socket.IO客户端将无法连接到纯文本 要么是WebSocket服务器。

https://socket.io/docs/