Java internet断开连接时重新连接OkHttp websocket

Java internet断开连接时重新连接OkHttp websocket,java,okhttp,okhttp3,Java,Okhttp,Okhttp3,我有以下课程。我正在尝试重新连接WebSocket以防失败 public class WebSocketClient extends WebSocketListener { volatile OkHttpClient client; volatile WebSocket webSocket; volatile Boolean isConnected = false; public WebSocketClient() { Proxy proxy =

我有以下课程。我正在尝试重新连接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断开连接时,如何重新连接单个连接?

对于多空闲连接客户端,请提供一个
连接池

client.connectionPool().evictAll();

executeAll()
方法将退出所有连接。

我在哪里调用它?
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");
        }



    }

}