【问题标题】:Reconnect OkHttp websocket when internet disconnects互联网断开时重新连接 OkHttp websocket
【发布时间】:2019-01-08 08:40:04
【问题描述】:

我有以下课程。我正在尝试让 WebSocket 重新连接以防万一发生故障

public class WebSocketClient extends WebSocketListener {
    volatile OkHttpClient client;
    volatile WebSocket webSocket;
    volatile Boolean isConnected = false;

    public WebSocketClient() {
        Proxy proxy = null;

        if (Main.useProxy) {
            tinder.CustomProxy proxyCustom = ProxyManager.GetStaticProxy(ThreadLocalManager.account.get().getProxyId());
            proxy = new Proxy(Proxy.Type.HTTP,
                    new InetSocketAddress(proxyCustom.getProxyIp(), proxyCustom.getProxyPort()));
        }

        client = new OkHttpClient.Builder().proxy(proxy).readTimeout(2, TimeUnit.SECONDS)
                .connectTimeout(2, TimeUnit.SECONDS).build();


        Request request = new Request.Builder().url("wss://echo.com/ws")
                .addHeader("Accept-Language", "en").build();
        webSocket = client.newWebSocket(request, this);
    }

    @Override
    public void onOpen(WebSocket webSocket, Response response) {
        AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.GREEN).a("Socket connection successful").reset());
        isConnected = true;
    }

    @Override
    public void onMessage(WebSocket webSocket, String text) {
        System.out.println("Text MESSAGE: " + text);
    }

    @Override
    public void onMessage(WebSocket webSocket, ByteString bytes) {

    }

    @Override
    public void onClosing(WebSocket webSocket, int code, String reason) {
        webSocket.close(1000, null);
        System.out.println("CLOSE: " + code + " " + reason);
        isConnected = false;
    }

    @Override
    public void onFailure(WebSocket webSocket, Throwable t, Response response) {
        isConnected = false;
        AnsiConsole.out
                .println(Ansi.ansi().fg(Ansi.Color.RED).a("Socket connection failed! will try to reconnect").reset());

        while (!isConnected) {
            try {
                AnsiConsole.out
                        .println(Ansi.ansi().fg(Ansi.Color.YELLOW).a("Waiting to try socket connection!").reset());
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Request request = new Request.Builder().url("wss://echo.com/ws")
                    .addHeader("Accept-Language", "en").build();
            webSocket = client.newWebSocket(request, this);
        }

        if (isConnected) {
            AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.GREEN).a("Socket connection successful").reset());
        }
    }

    public void close() {
        if (webSocket != null) {
            webSocket.close(1000, "Connection closed");
        }
        client.dispatcher().executorService().shutdown();
    }

}

问题是如果需要几次尝试重新连接,那么 onFailure 方法将被多次调用。导致多个 Web 套接字连接而不是一个。

当 websocket 断开连接时如何重新连接单个连接?

【问题讨论】:

    标签: java okhttp okhttp3


    【解决方案1】:

    对于多个空闲连接客户端提供connectionPool

    client.connectionPool().evictAll();
    

    evictAll() 方法驱逐所有连接。

    【讨论】:

    • 我该怎么称呼它?
    【解决方案2】:
    public class WebSocketClient extends WebSocketListener {
        volatile OkHttpClient client;
        volatile WebSocket webSocket;
        volatile Boolean isConnected = false;
    
        public WebSocketClient() {
            Proxy proxy = null;
    
            if (Main.useProxy) {
                tinder.CustomProxy proxyCustom = ProxyManager.GetStaticProxy(ThreadLocalManager.account.get().getProxyId());
                proxy = new Proxy(Proxy.Type.HTTP,
                        new InetSocketAddress(proxyCustom.getProxyIp(), proxyCustom.getProxyPort()));
            }
    
            client = new OkHttpClient.Builder().proxy(proxy).readTimeout(2, TimeUnit.SECONDS)
                    .connectTimeout(2, TimeUnit.SECONDS).build();
    
            Request request = new Request.Builder().url("wss://echo.com/ws")
                    .addHeader("Accept-Language", "en").build();
            webSocket = client.newWebSocket(request, this);
    
            // First Change
            client.connectionPool.evictAll();
        }
    
        @Override
        public void onOpen(WebSocket webSocket, Response response) {
            AnsiConsole.out.println(Ansi.ansi().fg(Ansi.Color.GREEN).a("Socket connection successful").reset());
            isConnected = true;
        }
    
        @Override
        public void onMessage(WebSocket webSocket, String text) {
            System.out.println("Text MESSAGE: " + text);
        }
    
        @Override
        public void onMessage(WebSocket webSocket, ByteString bytes) {
    
        }
    
        @Override
        public void onClosing(WebSocket webSocket, int code, String reason) {
            webSocket.close(1000, null);
            System.out.println("CLOSE: " + code + " " + reason);
            isConnected = false;
        }
    
        @Override
        public void onFailure(WebSocket webSocket, Throwable t, Response response) {
            // Second Change
            webSocket.close(1000, null);
            close();
            Thread.sleep(10000);
    
            Request request = new Request.Builder().url("wss://echo.com/ws")
                    .addHeader("Accept-Language", "en").build();
            webSocket = client.newWebSocket(request, this);
        }
    
        public void close() {
            if (webSocket != null) {
                webSocket.close(1000, "Connection closed");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 2017-06-18
      相关资源
      最近更新 更多