【问题标题】:SockJS connected as websocket, but nothing going throughSockJS 作为 websocket 连接,但没有通过
【发布时间】:2014-03-02 05:03:42
【问题描述】:

我在特定接入网络上使用 SockJS 时遇到了一个问题。它认为这与 SockJS 根据网络状态选择最佳传输协议(websocket、长轮询……)的方式有关。

使用网络浏览器,我的 SockJS 客户端通过 websocket 传输协议连接到我的节点 SockJS 服务器。我什至在节点上看到“连接时”事件。但是,当我发送数据时,没有任何东西通过它。详尽无遗,它在其他一些接入网络上运行良好。

根据http://websocketstest.com/网站的结果,这个接入网络的状态有点特殊:对于WebSockets(80端口),它被卡在了:

Connected       Yes✔
Data Receive    Yes✔

为了确保 websocket 正常工作,它还应该有一个由测试服务器每秒钟更新一次的“服务器时间”行。既然不是这样,我很确定我有一个透明的 HTTP 代理,它会破坏 websocket 连接。

但是,SockJS 没有发现这一点,并且它不会切换到回退协议。我以为它就是为此而设计的。

我对 SockJS 的传输协商能力有什么误解吗?

Socket.IO 在这种情况下更健壮还是对于这种具有透明 HTTP 代理的访问网络更健壮?

我知道我可以将 SockJS 与 SSL 一起使用,但我认为它只是一种后备方案,而不是真正的解决方案。

【问题讨论】:

    标签: javascript node.js websocket socket.io sockjs


    【解决方案1】:

    我认为您对 SockJS 的传输协商功能有误。 SockJS 是一个 websocket 仿真。 SockJS 的行为类似于 websocket。事实上,如果 websockets 客户端支持,它们就会被使用。但是当然,有些浏览器不支持 websockets,这是 SockJS 负责的。回退机制用于找到客户端支持的传输,而不是网络支持的传输。

    SockJS 遍历传输直到找到成功的连接这一事实有点误导它试图做什么。它不会处理网络中断 websocket 的情况,看起来好像 websocket 已连接,或者任何其他显示为已连接的传输(通过读取连接状态)但数据无法通过。

    您有责任确保数据通过网络传输,并且如果这是您想要的,您也有责任保持连接。这些东西超出了 websockets 的范围,因此也超出了 SockJS 的范围。

    【讨论】:

    • 好吧,但是,sockjs-client 中写道 "SockJS 旨在适用于所有现代浏览器和不支持 WebSocket 协议的环境,例如在限制性公司代理后面”。 后来,它被写成“轮询传输被用作旧浏览器和限制性代理背后的主机的后备”。 也许它测试网络的方式是有限的,但是 SockJS 是不仅仅是客户端对 websocket 的支持。
    • 这些事情都是真的。他们的意思是“websockets 无法成功连接的地方”。我不为 SockJS 的设计决策辩护,我认为很多人都在做出你对它的假设。源代码确实是准确了解您所获得内容的最佳方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2021-08-27
    • 1970-01-01
    • 2019-08-07
    • 2017-11-20
    • 2018-09-11
    • 2014-04-24
    相关资源
    最近更新 更多