我在特定接入网络上使用SockJS时遇到了问题。它认为这与SockJS根据网络状态选择最佳传输协议(websocket,长轮询......)的方式有关。
使用Web浏览器,我的SockJS客户端与websocket传输协议连接到我的节点SockJS服务器。我甚至在节点上看到“on connection”事件。但是,当我发送数据时,没有任何东西通过它。为了详尽无遗,它可以很好地与其他一些接入网络配合使用。
根据网站http://websocketstest.com/的结果,此访问网络的状态有点特殊:对于WebSockets(端口80),它被强调:
Connected Yes✔
Data Receive Yes✔
为了确保websocket运行良好,它还应该每秒由测试服务器更新“服务器时间”行。由于情况并非如此,我很确定我有一个透明的HTTP代理,可以打破websocket连接。
但是,SockJS没有发现它,并且它没有切换到回退协议。我认为它的目的是为了这样做。
我是否误解了SockJS的运输协商能力?
Socket.IO
在这种情况下是否更强大,或者对于这种具有透明HTTP代理的访问网络是否更健壮?
我知道我可以将SockJS与SSL一起使用,但我认为这是一个后备,而不是真正的解决方案。
答案 0 :(得分:1)
我认为你对SockJS的传输协商能力有误。 SockJS是一个websocket仿真。 SockJS的行为类似于websockets。实际上,如果客户端支持websockets ,则会使用它们。但是当然,有些浏览器不支持websockets,这就是SockJS所关注的。回退机制用于查找客户端支持的传输,而不是网络支持的传输。
SockJS通过传输迭代直到找到成功的连接这一事实对于它试图做的事情有点误导。它没有处理网络以某种方式打破websockets的情况,看起来好像连接了websocket,或者看起来连接的任何其他传输(通过读取连接状态)但是数据没有通过
您有责任确保数据通过网络传输,并且如果您打算这样做,您也可以保持连接状态。这些东西超出了websockets的范围,因此也是SockJS的范围。