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

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

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

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

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


person Funky Oordvork    schedule 03.04.2013    source источник


Ответы (1)


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

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

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

person Kristian Evensen    schedule 04.04.2013
comment
Спасибо за исчерпывающий ответ :) - person Funky Oordvork; 05.04.2013