Я пытаюсь создать простую программу, которая будет получать UDP-пакеты из модуля WiFi. Модуль WiFi отправляет пакет каждые 5 секунд, но я не смог получить его успешно.Почему мое простое приложение не принимает UDP-пакеты
Использование тостов в качестве способа отладки, я получаю их в правильном порядке до «НЕ ДОПУСКАЕТСЯ ЗДЕСЬ», что говорит о том, что проблема заключается в «socket.receive (packet) ' линия.
У кого-нибудь есть представление о том, почему он может не работать? Я также пробовал варианты кода, просматривая множество вопросов/примеров в Интернете, но все они все еще приводят к проблеме с линией «socket.receive (пакет)».
Кроме того, я написал сценарий python для выполнения того же самого, ищет UDP-пакеты на одном и том же порту и запускаю его с QPython, он получает пакеты, поэтому кажется, что пакеты отправляются WiFi модулем и получена на планшете, это просто, что приложение по какой-то причине не будет считывать данные.
Любая помощь или понимание будут очень благодарны, благодарю вас.
Вот код:
public void run() {
Toast.makeText(this, "RIGHT BEFORE TRY", Toast.LENGTH_LONG).show();
DatagramSocket socket;
DatagramPacket packet;
try {
Toast.makeText(this, "IN THE TRY", Toast.LENGTH _LONG).show();
socket = new DatagramSocket(9750);
byte[] buf = new byte[1024]; //buffer
socket.setSoTimeout(100000);
Toast.makeText(this, "Timeout is: " + socket.getSoTimeout(), Toast.LENGTH_LONG).show();
//DatagramPacket packet = new DatagaramPacket(buf, buf.length);
//Toast.makeText(this, "PACKET SIZE IS: "+buf.length, Toast.LENGTH_LONG).show();
// while(true) {
Toast.makeText(this, "IN THE WILD!", Toast.LENGTH_LONG).show();
packet = new DatagramPacket(buf, buf.length);
Toast.makeText(this, "PACKET SIZE IS: " + buf.length, Toast.LENGTH_LONG).show();
try {
//socket.receive(packet);
socket.receive(packet);
Toast.makeText(this, "GOT SOMETHING!", Toast.LENGTH_LONG).show();
}
catch (Exception i) {
// TODO Auto-generated catch block
//i.printStackTrace();
Toast.makeText(this, "DIDN'T GET IT HERE EITHER!", Toast.LENGTH_LONG).show();
}
//byte[] result = new byte[packet.getLength()];
byte[] result = packet.getData();
System.arraycopy(packet.getData(), 0, result, 0, packet.getLength());
String msg = new String(result);
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
Toast.makeText(this, "END WHILE!", Toast.LENGTH_LONG).show();
//}
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
Toast.makeText(this, "DIDN'T GET IT!", Toast.LENGTH_LONG).show();
}
}
Update: После первых двух ответов, похоже, что мы пытались сделать сетевые операции в основном потоке, что не выполнимо, так что мы в настоящее время пытаются реализовать его с помощью другого потока или асинхронной задачи. Надеюсь, с хорошими новостями :)
ли вы добавить '<использует-разрешение андроида: name = "android.permission.INTERNET" /> 'на ваш AndroidManifest.xml? Кроме того, можете ли вы распечатать 'i.toString()' в этом блоке 'catch'? – pelya
pelya, У меня есть оператор разрешения, и я просто добавил i.toString(). Результатом i.toString() является: 2! Android.os.NetworkOnMainThreadException –