我希望将WebSocket
与Java
一起使用。问题是,我的服务器通过无法配置的代理与客户端分离。我一直在搜索WebSocket
的实施,其中包含long-polling
等后备广告。我发现socket.io
但不知道后备是如何运作的。
在哪种情况下它取代WebSocket
以及如何?
是否有其他库,如socket.io和回退实现?我想在Java
中找到一个,但我只找到Jetty
。
编辑:回退是否仅取决于浏览器与WebSocket的兼容性?如果失败的原因是代理配置错误,那么socket.io会将其检测为兼容性故障,从而切换到长轮询(或其他技术)吗?
答案:自v1以来,socket.io包含engine.io,它带来了以下功能:
答案 0 :(得分:8)
Socket.io是websockets协议的几个实现之一,它的主要卖点(IMO)易于使用:您不需要编写保持活动机制或决定哪种传输最佳,它是为你做的。
所以,为了说清楚,socket.io并不能取代websocket协议,它是一个为你实现它的软件包。
你提到长轮询。这是socket.io使用的传输之一。长轮询是基于HTTP的,它基本上是请求 - >等待 - >响应和等待时间不长,因为EOF或过时连接上的负载平衡器可能会丢弃它。然而,当websockets协议(基于TCP)不可用且socket.io自动为您重新建立连接时,它仍然有用。请注意,websockets是一个相对较新的协议,于2011年批准,因此旧版浏览器不支持它。好吧,socket.io会检测到这一点然后再进行长轮询,所以你不必担心"担心"关于它。
websocket连接以HTTP开头,在同一端口上侦听。例如,http://localhost:8080(只是一个愚蠢的例子)。然后,当它成为可能时,socket.io会为您切换到ws:// localhost:8080。
使用socket.io时,我从未遇到网络拓扑挑战的问题,因为当HTTP端口可用并且使用长轮询/ websockets时,它对我来说很有用。
正如您所提到的,其中一个具有回退实现的库是netty-socket.io。请注意它如何配置两个传输:
public class Configuration {
private ExceptionListener exceptionListener = new DefaultExceptionListener();
private String context = "/socket.io";
private List<Transport> transports = Arrays.asList(Transport.WEBSOCKET, Transport.POLLING);
private int bossThreads = 0; // 0 = current_processors_amount * 2
private int workerThreads = 0; // 0 = current_processors_amount * 2
可以找到完整的代码here。
节点JS也有用于websockets的库,我在这里提到它只是为了澄清长轮询和websockets不是唯一的两个可用传输(可能是Java中唯一的传输):
io.set('transports', [ // enable all transports (optional if you want flashsocket)
'websocket'
, 'flashsocket'
, 'htmlfile'
, 'xhr-polling'
, 'jsonp-polling'
]);
简而言之,socket.io试图为您提供尽可能简单的操作,包括不必担心使用什么传输,因为它是为您完成的,但如果您仍然可以配置想。
我希望这个简短的解释可以帮到你!