Java 为什么我的简单应用程序不接收UDP数据包
我试图创建一个简单的应用程序,将接收来自WiFi模块的UDP数据包。WiFi模块每5秒发送一个数据包,但我一直无法成功接收 使用Toast作为调试的一种方式,我以正确的顺序接收它们,直到“这里也没有收到”,这告诉我问题出在“socket.receive(packet)”行 有人知道为什么它可能不起作用吗?我还通过在线查看大量问题/示例来尝试代码的变体,但它们都会导致“socket.receive(packet)”行出现问题 另外,我编写了一个python脚本来做同样的事情,在同一个端口上查找UDP数据包,并使用QPython运行它,它确实接收数据包,因此数据包似乎是由WiFi模块发送的,平板电脑接收的,只是由于某种原因,应用程序无法读取数据 任何帮助或见解都将不胜感激,谢谢 代码如下:Java 为什么我的简单应用程序不接收UDP数据包,java,android,sockets,Java,Android,Sockets,我试图创建一个简单的应用程序,将接收来自WiFi模块的UDP数据包。WiFi模块每5秒发送一个数据包,但我一直无法成功接收 使用Toast作为调试的一种方式,我以正确的顺序接收它们,直到“这里也没有收到”,这告诉我问题出在“socket.receive(packet)”行 有人知道为什么它可能不起作用吗?我还通过在线查看大量问题/示例来尝试代码的变体,但它们都会导致“socket.receive(packet)”行出现问题 另外,我编写了一个python脚本来做同样的事情,在同一个端口上查找UD
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();
}
}
更新:在前两个答案之后,看起来我们试图在主线程中执行网络操作,这是不可行的,因此我们目前正在尝试使用另一个线程或异步任务来实现它。希望有一些好消息:)正如您所说,存在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();
您是否已将
添加到AndroidManifest.xml中?另外,您能在catch
block中打印出i.toString()
吗?pelya,我有权限声明,我刚刚添加了i.toString()。i.toString()的结果是:2!android.os.NetworkOnMainThreadExceptionEkant Sharma最初在没有超时功能的情况下尝试了这个功能,因为我知道它默认为无限,但它仍然不起作用,所以我添加了这个功能来使用它。