2017-05-21 121 views

回答

0

(n秒而不握手之后附近网络问题或由服务器超时或kickout)中的WebSocket问题重新连接我不确定如果你已经解决了这个问题,但我设法想出一个解决方案来重新连接WebSocket连接。

对于我的情况,我想重新连接我的WebSocket连接,如果@OnWebSocketError方法被触发。起初,我实现了它这样的

实施中的

@OnWebSocketError 
public void onError(Throwable e) { 
    someMethodToReconnect(); 
} 

和内部someMethodToReconnect

if (client == null) { 
    client = new WebSocketClient(sslContextFactory); 
    client.setMaxIdleTimeout(0); 
} 

if (socket == null) { 
    socket = new ReaderSocket(); // ReaderSocket is the name of my @WebSocket class 
} 

try { 
    client.start(); 
    client.connect(socket, new URI(socketUrl), request); 
} catch (Exception e) { 
    LOGGER.error("Unable to connect to WebSocket: ", e); 
} 

然而,这导致了另一个问题。如果服务器未启动,则有两种类型的错误返回。例外是java.net.ConnectExceptionorg.eclipse.jetty.websocket.api.UpgradeException

的流动将是:

  1. 到网页套接字服务器初始请求(服务器未启动)
  2. java.net.ConnectException抛出
  3. org.eclipse.jetty.websocket.api.UpgradeException抛出

而在执行甲someMethodToReconnect会被调用两次。

这导致实现B中

@OnWebSocketError 
public void onError(Throwable e) { 
    if (e instanceof ConnectException) { 
     // Attempt to reconnect 
     someMethodToReconnect(); 
    } else { 
     // Ignore upgrade exception 
    } 
} 

到目前为止实现B中工作正常,但我试图找出是否有将被抛出任何其他异常。

1

@Vantablack,其实我们不能做重新连接的onError回调方法,它可能会导致异常:

java.util.concurrent.RejectedExecutionException: Max requests per destination 1024 exceeded for HttpDestination 

这里是我的解决方案: 创建一个线程之前连接:

new Thread(new Runnable() { 
      public void run() { 
       while (true) { 
        try { 
         Thread.sleep(2 * 1000L); 
        } catch (InterruptedException e) { 
        } 
        if (connClosed.get() && !connecting.get()) { 
         try { 
          connect(); 
         } catch (Exception e) { 
          logger.warn(e.getMessage(), e); 
         } 
        } 
       } 
      } 
     }).start(); 
and set connecting=true in connect function, and connecting = false in onConnect, onError, onClose method. set connClosed=true in onError,onClose, =false in onConnect. 

这样,无论在一个会话中调用onError多少次,只重新连接一次。