У меня есть крайний UDP-пакет потерь с Android, и это не имеет смысла. Ситуация выглядит следующим образом:java - android UDP ненадежность
- PC работает Java-клиент подключен к домашней сети
- Телефон работает Java-сервер (Android), подключенного к домашней сети
- Home маршрутизатор новый WRT1900ac. Сеть имеет подключение к Интернету.
- UDP пакеты маленькие (< 15 байт)
Симптомы:
Если компьютер посылает UDP пакет на другой компьютер (как в той же сети) она работает очень ну (почти никаких пакетов не потеряно).
Если Android отправляет пакет UDP на ПК в той же сети, он также работает очень хорошо (почти никаких пакетов не потеряно).
Если ПК отправляет UDP на Android в той же сети, я получаю экстремальные потери пакетов (в 50% случаев и более - но это зависит от типа).
В большинстве случаев я вынужден послать пакет как 10 раз, чтобы получить один через. В других случаях все проходит довольно долго. Очень странное поведение, которое происходит только на приемном конце андроида. Если я заменить андроид с ПК, на котором работает тот же код на java или просто получает пакет через UDP-сервер Packet Sender У меня нет потерь вопросов. Еще одна вещь, которую я заметил, заключается в том, что если вместо перехода через маршрутизатор я перехожу через другую точку доступа, которая не имеет подключения к интернету или никакая другая производительность клиентов, как представляется, значительно улучшается. Это, как ожидается, но мой вопрос заключается в том, что приемная сторона Android видит такие плохие показатели и проигрывает так много пакетов. Когда Android заменяется другим ПК, на котором работает тот же код, и в той же сети нет проблем. Android
также нет проблем с отправкой пакеты (никаких пакетов не пропало). Поэтому на приемном конце должно быть что-то еще, связанное с android ...
Я также попытался заменить код ПК на Sender пакета и получить те же результаты. Проблема, похоже, в том, что приемник Android. Я запускаю тот же UDP-код на стороне ПК и на Android.
Передающий код UDP прост:
public void sendMessage(String message)
{
try {
DatagramSocket ds = new DatagramSocket();
DatagramPacket dp;
InetAddress local = InetAddress.getByName(ipPool);
dp = new DatagramPacket(message.getBytes(), message.length(), local, port);
ds.setBroadcast(true);
ds.send(dp);
ds.close();
} catch (Exception e) {
e.printStackTrace();
}
}
UDP-прием кода на андроид жизни в UDP-класса сервера:
public class UDP_Server
{
CommandParser commandParser;
public UDP_Server(MainActivity mainActivity)
{
Log.i("Udp tutorial", "---------------------------Starting UDP SERVER");
commandParser = new CommandParser(mainActivity);
String text;
int server_port = 9876;
try
{
DatagramSocket s = new DatagramSocket(server_port);
s.setBroadcast(true);
//s.setReceiveBufferSize(163840);
while (true)
{
byte[] message = new byte[1024];
DatagramPacket p = new DatagramPacket(message, message.length);
s.receive(p);
text = new String(message, 0, p.getLength());
Log.d("Udp tutorial","message:" + text);
//commandParser.parseCommand(text);
//s.close();
}
} catch (SocketException e)
{
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
UDPServer.класс Java конкретизируется через основную деятельность «OnCreate()» метод:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
wm = (WifiManager) getSystemService(WIFI_SERVICE);
Log.i("Udp tutorial", "---------------------------HERE 1");
Thread thread = new Thread(new Runnable()
{
public void run()
{
UDP_Server svr = new UDP_Server(MainActivity.this);
}
});
thread.setPriority(Thread.MAX_PRIORITY);
thread.start();
// TCPServer server = new TCPServer();
}
Не уверен, что это может быть разрешено таким образом ... это не удивило бы меня, если бы вам пришлось использовать какой-то инструмент, например wirehark, чтобы внимательно наблюдать за всем сетевым трафиком, чтобы понять, что происходит. – GhostCat
Как уже было сказано, попробуйте использовать wirehark и посмотрите, что происходит. Кроме того, попробуйте другое устройство Android, если это возможно, чтобы узнать, есть ли у вашего устройства проблемы. – jython234