【问题标题】:Why HTML WebSocket access Socket.io web socket server failed?为什么 HTML WebSocket 访问 Socket.io Web 套接字服务器失败?
【发布时间】:2014-09-26 19:00:17
【问题描述】:

正如socket.io所说,它支持WebSocket,所以,我使用HTML5标准的web socket api来访问socket.io服务器,但我总是得到以下错误:

到 'ws://localhost:8080/' 的 WebSocket 连接失败:连接 在收到握手响应之前关闭

然后,我尝试在js中使用socket.io客户端访问socket.io服务器,它可以工作,并且通过chrome网络监控,我发现它正确使用了web socket协议。

有没有人尝试过 W3C Websocket api 来访问 socket.io 服务器并遇到类似的问题?或我的问题的任何想法或线索?赞赏!

测试代码在这里:https://github.com/piginzoo/socketiotest

【问题讨论】:

  • 现在我使用socket.io 0.9来适配AndroidASync项目,现在只支持socket.io 0.9。
  • Chrome 和 IE-11 有完全相同的问题。后者给出了更具体的错误消息:“WebSocket Error: Network Error 12152, The server returned an invalid or unrecognized response” 看起来 socket.io 与 Chrome 或 IE-11 实现的 Websocket API 并不真正兼容

标签: node.js websocket socket.io


【解决方案1】:

我们遇到了完全相同的问题。以ws websockets 结束。不确定是否有更好的解决方案。

【讨论】:

    【解决方案2】:

    注意:Socket.IO 不是 WebSocket 实现。尽管 Socket.IO 确实尽可能使用 WebSocket 作为传输,但它为每个数据包添加了一些元数据:数据包类型、命名空间和需要消息确认时的 ack id。这就是为什么 WebSocket 客户端将无法成功连接到 Socket.IO 服务器,而 Socket.IO 客户端也将无法连接到 WebSocket 服务器(如 ws://echo.websocket.org)。
    我在 socketio github 问题中发现了这一点:
    Socket.IO 不是 WebSocket 服务器。请改用ws https://github.com/socketio/socket.io/issues/3022

    【讨论】:

      【解决方案3】:

      您收到的错误消息是因为您使用了错误的网址。错误消息“在收到握手响应之前连接已关闭”实际上告诉您这一点(没有收到响应

      应该是'ws://localhost:8080/socket.io/?EIO=3&transport=websocket' 详情请查看https://socket.io/docs/client-api/#With-custom-path & https://socket.io/docs/internals/

      例如

      "EIO=3"               # the current version of the Engine.IO protocol
      

      但是正如其他答案所说,实际上是what socket.io readme said

      尽管 Socket.IO 确实尽可能使用 WebSocket 作为传输,但它会为每个数据包添加一些元数据:数据包类型、命名空间和需要消息确认时的 ack id。这就是为什么 WebSocket 客户端将无法成功连接到 Socket.IO 服务器,而 Socket.IO 客户端将无法连接到 WebSocket 服务器。

      我已经测试验证ws 和浏览器原生 Websocket 都不能连接到 Socket.IO 服务器。他们都在连接后立即与Socket.IO服务器断开连接,Socket.IO服务器发送错误消息socket id xxx has disconnected with reason parse error

      ws作者这里也提到了https://github.com/websockets/ws/issues/1390

      使用普通 WebSocket 与 Socket.IO 服务器通信不能无缝工作。

      如果你想使用浏览器原生的Websocket你可以使用ws can server。

      【讨论】:

        猜你喜欢
        • 2018-04-21
        • 2011-05-07
        • 2015-03-08
        • 1970-01-01
        • 1970-01-01
        • 2017-02-19
        • 1970-01-01
        • 2015-01-17
        • 1970-01-01
        相关资源
        最近更新 更多