Заставить android немедленно отправлять 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

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

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

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

1 ответов


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

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


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

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

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

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