Проблема с веб-сокетом Java при отключении Wi-Fi

Я использую org.java_websocket.WebSocket для создания сервера Websocket на своем устройстве Android. У меня к нему подключены клиенты на рабочем столе.

Я хочу, когда Wi-Fi недоступен, выключить сервер и уведомить клиентов об отключении. Что происходит, когда у меня есть широковещательный приемник, как показано ниже, он выключает сервер, но клиенты не осознают этого в течение очень долгого времени. Есть ли этому повод?

public void onReceive(Context context, Intent intent) {
    ConnectivityManager conMngr = (ConnectivityManager)context.getSystemService(context.CONNECTIVITY_SERVICE);
    NetworkInfo wifi = conMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
    NetworkInfo mobile = conMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

    // Perform operations here to shut down web socket server
}

Обычно, когда Wi-Fi недоступен, я хочу иметь возможность выключить сервер и уведомить клиентов. Почему, когда я делаю conn.close() для каждого подключения, я не получаю уведомление на настольном клиенте?

Кроме того, одним из моих клиентов является клиент для Mac, который использует Starscream (https://github.com/daltoniam/Starscream). Не уверен, что мне следует знать что-нибудь об этом.


person KVISH    schedule 28.03.2016    source источник


Ответы (1)


Если ваш сервер WebSocket полностью соответствует спецификации IETF, он должен понимать фреймы управления WS ping / pong. Если это не так (и ваш клиентский код не работает), вам необходимо изучить настройки тайм-аута TCP. Таймауты TCP могут составлять несколько минут. Напомним, TCP был разработан, чтобы повторить попытку при сбое соединения.

person FrankG    schedule 30.03.2016