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

Gré*_*rel 8 java fallback long-polling websocket socket.io

我想WebSocketJava.问题是,我的服务器通过无法配置的代理与客户端分离.我一直在寻找WebSocket具有后备的实现,例如long-polling.我发现socket.io但不知道后备是如何工作的.

在哪种情况下,它取代WebSocket和如何?

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

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

答:从v1开始,socket.io包含engine.io,它带来了以下功能:

在此输入图像描述

arn*_*old 10

Socket.io是websockets协议的几个实现之一,它的主要卖点(IMO)易于使用:您不需要编写保持活动机制或决定哪种传输最好,它是为您做的.

所以,为了说清楚,socket.io不会取代websocket协议,它是一个为你实现它的包.

你提到了长轮询.这是socket.io使用的传输之一.Long Polling是基于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
Run Code Online (Sandbox Code Playgroud)

完整的代码可以在这里找到.

Node JS也有用于websockets的库,我在这里提到它只是为了澄清长轮询和websockets不是唯一的两个可用传输(可能是Java中唯一的传输):

io.set('transports', [                     // enable all transports (optional if you want flashsocket)
            'websocket'
          , 'flashsocket'
          , 'htmlfile'
          , 'xhr-polling'
          , 'jsonp-polling'
        ]);
Run Code Online (Sandbox Code Playgroud)

简而言之,socket.io试图为您提供尽可能简单的操作,包括不必担心要使用什么传输,因为它是为您完成的,但如果您愿意,仍然可以配置.

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

  • 是的,这是我对你所有问题的回答.socket.io的回退就像黑魔法一样:它以可能的最佳连接开始,然后一直降级直到失败.但是,你要么喜欢这个,要么讨厌它.我有一些不喜欢这种功能的同事:他们想要编写后备代码,让自己保持活力(心跳).如果是这种情况,那么,无论如何,请使用engine.io,这是socket.io的基础.这一切都取决于你想要自己编码多少或依赖工具.就个人而言,我喜欢socket.io,但这只是我的意见. (3认同)
  • 关于Java:它使用线程池进行连接,这在大规模上可能很昂贵.请注意,线程池基本上是时间切片功能,而不是"真实"线程(直到CPU代码).如果您的客户数量很大,并且您对其他工具持开放态度,那么Node JS*可能会更适合您的情况.它的架构是异步的,非阻塞的,单线程的.但这不是主题,因为你的问题是关于socket.io.我添加了这条评论,因为你问过Java.简而言之:您几乎可以在Java上做任何事情,但还有其他工具可供选择.祝好运! (3认同)
  • @tonix:它仍然有道理。一些公司限制 ws 连接,因此这些公司的员工需要使用后备的站点。 (2认同)