如何使用socket.io进行后备工作?

时间:2015-10-01 15:30:34

标签: java websocket socket.io long-polling fallback

我希望将WebSocketJava一起使用。问题是,我的服务器通过无法配置的代理与客户端分离。我一直在搜索WebSocket的实施,其中包含long-polling等后备广告。我发现socket.io但不知道后备是如何运作的。

在哪种情况下它取代WebSocket以及如何?

是否有其他库,如socket.io和回退实现?我想在Java中找到一个,但我只找到Jetty

编辑:回退是否仅取决于浏览器与WebSocket的兼容性?如果失败的原因是代理配置错误,那么socket.io会将其检测为兼容性故障,从而切换到长轮询(或其他技术)吗?

答案:自v1以来,socket.io包含engine.io,它带来了以下功能:

enter image description here

1 个答案:

答案 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试图为您提供尽可能简单的操作,包括不必担心使用什么传输,因为它是为您完成的,但如果您仍然可以配置想。

我希望这个简短的解释可以帮到你!