Переподключение веб-сокета OkHttp при отключении Интернета - PullRequest
0 голосов
/ 08 января 2019

У меня есть следующий класс. Я пытаюсь восстановить соединение 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 будет вызываться несколько раз. Вызывает несколько соединений через веб-сокет вместо одного.

Как я могу повторно подключиться к одному соединению при разъединении websocket?

1 Ответ

0 голосов
/ 02 марта 2019

Для клиента с несколькими простоями укажите connectionPool

client.connectionPool().evictAll();

метод evictAll() исключает все соединения.

...