Принудительно андроид отправить пакеты UDP немедленно?

Я экспериментирую с подключением своего Galaxy Ace к ноутбуку через WiFi. Оба устройства подключаются к маршрутизатору через WiFi, и обе стороны используют Java.

После того, как TCP-соединение время от времени давало мне очень высокие пинги, я решил основать соединение на UDP, чтобы иметь возможность контролировать, когда пакеты отправляются.

Тем не менее, похоже, что Android по-прежнему буферизирует UDP-пакеты и не отправляет их немедленно. Это или полностью отключает WiFi, если нет исходящих данных, переданных за некоторую долю секунды.

Во-первых, я звонил по телефону с нерегулярными интервалами примерно раз в секунду, неоднократно отправляя запросы на ping, пока не был получен ответ (охватывающий потерю пакетов в UDP):

computer -> phone -> computer Pinging 192.168.1.40: 148.05968ms Pinging 192.168.1.40: 524.41156ms Pinging 192.168.1.40: 705.8688ms Pinging 192.168.1.40: 3.705367ms Pinging 192.168.1.40: 3.872159ms Pinging 192.168.1.40: 549.4541ms Pinging 192.168.1.40: 479.29843ms Pinging 192.168.1.40: 3.89936ms Pinging 192.168.1.40: 428.85876ms Pinging 192.168.1.40: 739.28125ms 

Я работал над этой проблемой, отправляя пакеты с телефона на компьютер всего за 1 байт данных каждые 100 мс, ничего не изменяя в обычной программе:

  computer -> phone -> computer Pinging 192.168.1.40: 4.147753ms Pinging 192.168.1.40: 3.738213ms Pinging 192.168.1.40: 14.133768ms Pinging 192.168.1.40: 4.470561ms Pinging 192.168.1.40: 3.628386ms Pinging 192.168.1.40: 3.898334ms Pinging 192.168.1.40: 3.512401ms Pinging 192.168.1.40: 7.907006ms Pinging 192.168.1.40: 5.234216ms Pinging 192.168.1.40: 5.639137ms 

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

Кстати, я предполагаю, что проблема – это смартфон, а не компьютер, хотя он также может быть компьютером, ожидающим входящих пакетов, а затем отправлением своих пакетов. Однако из того, что я знаю о создании сетей, это маловероятно.

Спасибо за вашу помощь!

Что касается Java, то после вызова DatagramSockect.send (…) дейтаграмма отправляется. В пространстве приложений Java нет буферизации и нет способа контролировать буферизацию в ОС.

Маловероятно, что TCP или UDP являются «сдерживающими» пакетами. Гораздо более вероятно, что корневая проблема – это что-то на уровне WiFi … или, возможно, с маршрутизацией … и ОС задерживает отправку пакетов, пока проблема не решится сама.


Спасибо, теперь я реализовал отправку этих пакетов keep-alive только в том случае, если в течение этого времени не было другого отправленного пакета.

Это звучит так, как будто ваши живые пинги имеют желаемый эффект … и из этого я делаю вывод, что основная проблема заключается в том, что связь Wi-Fi «снижается» из-за бездействия. (Это звучит как функция «не слить батарею» …) Это говорит о том, что альтернативным решением было бы узнать, можете ли вы настроить таймаут WiFi.

Кроме того, было бы быстрее отправлять пакеты в другой порт, на котором никто не слушает? Он все равно должен иметь такой же эффект, не так ли?

Вряд ли это будет иметь значение. Нет никаких доказательств того, что проблема вызвана перегрузкой. Свидетельство указывает на то, что ваш телефон отключает неактивный WiFi для экономии энергии …