Android Multicast сокет перестает слушать
У меня есть сервис на Android, который слушает и отвечает на пакеты, которые он получает через многоадресную рассылку.
Это работает большую часть времени, но, к сожалению, я обнаруживаю, что время от времени он просто прекращает получать пакеты. Поток остается заблокированным при вызове MulticastSocket.receive(), но ничего не выходит. Я медленно пытался отследить, что это вызывает, и обнаружил, что выключение и повторное включение беспроводного соединения или изменение беспроводного соединения сделает это.
Чтобы успешно продолжить прослушивание моих пакетов, мне нужно закрыть MulticastSocket и заново создать его. Однако я не нашел никакого способа сделать это - я не получаю никаких уведомлений о том, что что-то произошло: никаких намерений, никаких исключений Java, ничего. Я ожидаю, что при получении будет выдано исключение IOException, если сокет станет недействительным, но, похоже, этого не происходит.
Может ли кто-нибудь предложить какое-либо понимание относительно (а) того, что на самом деле происходит, и (б) как обойти это? Прямо сейчас мое лучшее предположение - постоянно разрушать и воссоздавать сокет каждые десять секунд или около того, и это просто зло.
2 ответа
Примечание. Этот ответ имел смысл, когда вопрос задавался в 2010 году, вероятно, он не имеет значения сегодня.
Я думаю, что смена беспроводных сетей во многом схожа с отключением и повторным включением сети (вероятно, с другим IP-адресом и маршрутизацией), поэтому неудивительно, что все обрывается.
Возможно, регистрация изменений в информации о сети даст вам необходимое предупреждение?
http://developer.android.com/reference/android/net/ConnectivityManager.html
и связанные страницы
Вы приобретаете многоадресную блокировку?
WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
MulticastLock lock = manager.createMulticastLock("lock name");
lock.setReferenceCounted(true);
lock.acquire();
Также кажется, что некоторые устройства блокируют многоадресную рассылку: