Что приводит к тому, что многоадресные сообщения не передаются сразу после перезагрузки Wi-Fi - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть приложение для Android, которое создает MulticastSocket, присоединяется к группе MC и получает сообщения с другого компьютера в локальной сети Wi-Fi.

MulticastSocket socket = new MulticastSocket(null); // Create an unbound socket.
socket.setSoTimeout(LISTEN_TIMEOUT_MILLIS);
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress(listenPort)); // Bind to the configured multicast port

final WifiManager.MulticastLock lock = wifiManager.createMulticastLock("my_lock");
lock.acquire();

socket.setNetworkInterface(networkInterface);
socket.joinGroup(multicastGroup);
while (true) {
    socket.receive(packet);
    // Do something with the packet
    // Handle timeout etc.
    // Handle change of network interface by leaving group, setting netIntf and joining group again.
}
socket.leaveGroup(multicastGroup);
socket.close();

lock.release();

Хорошо работает на большинстве устройств Android (Huawei, Samsung),но в некоторых (Pixel3), если WiFi на устройстве выключен, а затем снова включен, когда приложение видит, что соединение Wi-Fi активируется, может пройти до 14 минут (это очень изменчиво), прежде чем начнутся сообщения MC.получение снова.

Даже выбрасывание Socket и создание нового MCSocket не уменьшает задержку.

Но это должно быть какое-то состояние, которое удерживается внутри JVM, потому что перезапускприложения вызывает его немедленное подключение.

Такое ощущение, что для подключения MC удерживается некоторая аренда, которая обновляется только в тактовом цикле.

Так что мои вопросы:

  1. Что приводит к тому, что сообщения MC не передаются сразу после восстановления соединения WiFi и создания нового MCSocketхотел послушать это.
  2. Что я могу сделать, чтобы обеспечить своевременное возобновление потока сообщений?

1 Ответ

0 голосов
/ 02 января 2019

Я заметил, что вы обновили свой вопрос, включив в него WifiManager.MulticastLock

Интересно, если вы повторно захватываете блокировку, когда возвращается соединение Wi-Fi, некоторые сообщения здесь на SO подразумевают, что это необходимо.

Я отмечаю комментарий к следующему сообщению:

Re: https://stackoverflow.com/a/4002084/1015289

оказывается, что ваша блокировка многоадресной рассылки разрушается, когда соединение исчезает (длинныйзадержка состояла в том, что я переписывал свой код три раза, прежде чем я понял это).Таким образом, вы должны повторно захватывать блокировку каждый раз, когда соединение возвращается

...