Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android UDP服务器不接收数据包_Android_Udp - Fatal编程技术网

Android UDP服务器不接收数据包

Android UDP服务器不接收数据包,android,udp,Android,Udp,我有以下代码来接收UDP数据包: public class AsyncReceiveUdp2 extends AsyncTask<String, Void, Boolean> { @Override protected Boolean doInBackground(String... f_url) { int udp=111; byte[] packet = new byte[2000]; DatagramPacket dp = new DatagramPac

我有以下代码来接收UDP数据包:

public class AsyncReceiveUdp2 extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... f_url) {
    int udp=111;
    byte[] packet = new byte[2000];
    DatagramPacket dp = new DatagramPacket(packet, packet.length);
    DatagramSocket ds = null;
    try {
        ds = new DatagramSocket(udp);
        ds.receive(dp);
        //...
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (ds != null) {
            ds.close();
        }
    }
    return null;
}
公共类AsyncReceiveUdp2扩展了AsyncTask{
@凌驾
受保护的布尔doInBackground(字符串…f_url){
int-udp=111;
字节[]数据包=新字节[2000];
DatagramPacket dp=新的DatagramPacket(数据包,数据包.长度);
DatagramSocket ds=null;
试一试{
ds=新的DatagramSocket(udp);
ds.接收(dp);
//...
}捕获(SocketException e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}最后{
如果(ds!=null){
ds.close();
}
}
返回null;
}
}

我从Android设备向计算机发送UDP数据。 计算机立即以UDP数据包的形式发送响应。 我将信息保存到SD上的日志文件中。 我看到,我的应用程序保持在“ds.receive(dp);”行上,并且不会在后面运行。 我已经在安卓设备上对计算机上的一个程序进行了测试。 据我所知,在Emulator上接收UDP数据包很棘手。 我做不到。 重定向不适用于我,正如所描述的那样

另一个重要问题是接收发送到设备的所有数据包。无损的。如何修改该代码


请帮忙!谢谢

将您的接收置于while(true)循环中。当您收到一个数据包调用时,一个if(pkg_received){break;}。。。或者不管你想做什么。。。 问题是,您可能只收到一个包,并且在收到它之前会得到超时

已编辑但未测试的代码

 while(true)
    {


        byte[] message = new byte[60*1024];
        DatagramPacket recv_packet = new DatagramPacket(message, message.length);


        try {
            socket.receive(recv_packet);
        } catch (IOException e) {
            e.printStackTrace();
        }

        Log.d("UDP", "S: Receiving...listening on port " + recv_packet.getPort() );
        String rec_str;
        rec_str=new String(recv_packet.getData)

        Log.d("PACKAGE LENGTH",Integer.toString(recv_packet.getLength()));
}

UDP不是无损协议,请使用TCP。。它使用32位CRC检查数据包是否收到,以及数据包的完整性。我使用的协议是UDP协议。没有选择的机会。谢谢。好的,但是你不能确定会收到一个包裹。这就是UDP和TCP之间的区别。UDP更快,因为您不检查是否收到数据包。TCP已经处理了,包括数据包格式错误时(CRC错误)