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

29

我正在尝试使用socket.io-client连接一个用Go编写的websocket服务器。我已经成功使用node 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事件被触发,代码立即退出。我尝试了:在URL中省略端口并在选项中添加它,在选项中省略传输选项(根据文档意味着“全部”)并使用http URL。 socket-io.client无法连接到“标准”websocket吗?


你有查看过网络流量吗?Socket.io 在决定使用哪种传输方式之前会尝试进行 HTTP 握手;你可能没有正确地响应握手请求。 - Aaron Dufour
那么你认为我需要在我的套接字服务器上添加代码才能使它与socket.io客户端配合工作? - jcollum
你最好不要使用socket.io客户端 - 你是用它做什么的? - Aaron Dufour
Socket.io是一个相当重的包装器。它进行传输协商,处理大约半打或更多的传输、消息类型、ping等。为了使用客户端,您可能需要实现socket.io服务器的大部分功能。为什么不直接使用裸WebSockets呢? - Aaron Dufour
就像我说的那样,我很好奇为什么SIO在这里不能工作--如果它包装了Websockets,那么它不应该只是插入但在客户端侧提供更多功能吗?我找不到任何理由,说明我不能使用SIO与基本的Websocket连接进行通信。 - jcollum
显示剩余3条评论
2个回答

48
根据我们的聊天记录,看起来您被这个引用所误导:

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

这意味着从与Socket.io客户端/服务器交互的客户端/服务器代码的角度来看,它与WebSocket相似。然而,网络流量看起来与简单的WebSocket非常不同 - 除了连接之外还有一个初始握手,以及建立在WebSocket之上的更强大的协议。 握手在此处描述 (链接到Socket.IO协议规范),消息协议在此处描述(链接到Socket.IO协议规范)

如果您要编写WebSocket服务器,最好只使用原始的WebSocket接口,而不是Socket.io客户端,除非您打算实现所有Socket.io协议。


26
感谢主。在我寻找这个确切问题之前,我浪费了一个小时的调试时间。我真的希望这个网站更清晰地表明socket.io需要客户端和服务器端组件,并且不能与仅使用WS的客户端交互。对我来说,它读起来相反-它可以与WS或其他2-3种协议通信。 - Hamy
@Aaron Dufour,我使用websocket接口连接到了websocket服务器。如果我想将从websocket服务器接收到的数据通过我的websocket接口发送给通过http服务器连接到我的客户端,我应该使用socket.io吗?因此,最终我将socket.io连接到http服务器,并使用websocket接口获取数据,在消息到达时通过socket.io发送到客户端。请建议... - uno-2017
@moata_u 请为此创建一个新问题。 - Aaron Dufour
创建的问题是..https://dev59.com/BY_ea4cB1Zd3GeqPVPVg - uno-2017
1
在尝试让它工作之前,我很高兴在SO上查找了这个。感谢@AaronDufour。 - RozzA

4

不确定在此期间是否如此,但现在socket.io的网站在文档中直接说明了。

尽管当有可能时Socket.IO确实使用WebSocket作为传输方式, 但它会向每个数据包添加额外的元数据。这就是为什么WebSocket客户端不能成功连接到Socket.IO服务器, 而Socket.IO客户端也无法连接到普通的WebSocket服务器的原因。

https://socket.io/docs/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接