Поддержание двунаправленного соединения UDP

Я пишу клиент UDP для Android, который подключается и связывается с двунаправленным (без связи между отправленными и полученными сообщениями) с сервером Windows. Как только исходная датаграмма отправлена ​​на сервер, я хочу иметь возможность отправлять данные в любом направлении в любое время. Мои вопросы:

1) Правильно ли держать исходный разъем открытым и использовать его для отправки и получения?

2) Должен ли я отправлять и получать в том же потоке (с тайм-аутом при получении) или в отдельных потоках (позволяя получать блокировать)?

3) Будет ли сокет автоматически закрываться, если данные не будут отправлены / получены в течение определенного интервала?

  1. Да, это не проблема, и это самый удобный способ справиться с двунаправленной связью. Кроме того, если клиент размещен за NAT, для правильной работы отверстия требуется перфорация отверстия . Несмотря на то, что вы привязываетесь к одному и тому же IP и порту на клиенте, вам не гарантируется получение одинакового отображения в NAT. Таким образом, сервер не сможет связаться с клиентом. Помните, что эти сопоставления тайм-аут и инициируются внутри NAT-сети, поэтому может потребоваться некоторое исследование, если клиент простаивает в течение длительного времени.

  2. Это зависит от того, как вы разрабатываете приложение, но нет никаких проблем с этим. Просто проверьте состояние чтения и записи сокета, используя, например, select. Если вы создадите неблокирующий сокет в сочетании с записью / записью-очередью, вы обязательно не заблокируете операцию. Поскольку UDP либо пишет все, либо ничего, очередь довольно проста.

  3. Основываясь на моем опыте, это зависит от конкретного поставщика на Android. Некоторые телефоны продолжают открывать сокеты долгое время, а другие закрывают их после определенного периода ожидания. Все телефоны, похоже, закрывают сокеты, когда устройство переходит в спящий режим (состояние при нажатии кнопки питания), за исключением тех, которые связаны с фоновой задачей.