0

我在特定接入网络上使用 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 一起使用,但我认为这只是一个后备方案,而不是真正的解决方案。

4

1 回答 1

1

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

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

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

于 2014-02-05T17:54:16.233 回答