我正在尝试创建一个简单的应用程序,它将从WiFi模块接收UDP数据包。 WiFi模块每5秒发送一次数据包,但我无法成功接收数据包。
使用toasts作为一种调试方式,我按照正确的顺序接收它们,直到“不要在这里得到它”,这告诉我问题在于'socket.receive(packet)'线。
有没有人知道为什么它可能不起作用?我也通过在线查看很多问题/示例尝试了代码的变体,但它们仍然导致'socket.receive(packet)'行的问题。
另外,我编写了一个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();
}
}
更新:在前两个答案之后,看起来我们试图在主线程中进行网络操作,这是不可行的,所以我们目前正在尝试用另一个线程或异步任务来实现它。希望有一些好消息:)
答案 0 :(得分:0)
如你所说有NetworkOnMainThread异常,你只需要把这个问题放在新线程上并启动它......
Thread thread = new Thread() {
@Override
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();
}
}
};
thread.start();