为什么Android UDP服务器延迟后不接收数据包

为什么Android UDP服务器延迟后不接收数据包,android,udp,Android,Udp,我尝试在我的设备上使用下面的UDP服务器代码。 奇怪的行为。 如果我将第一个数据包发送到设备,它不会接收到它, 继续使用“ds.接收(dp);”。 然后程序接收下一个数据包好的, 如果我发送的时间间隔小于20秒。 但在发送延迟约20秒后,它会再次停止接收。 然后它再次接收下一个数据包 public class UDP_Server { private AsyncTask<Void, Void, Void> async; int udp; private

我尝试在我的设备上使用下面的UDP服务器代码。 奇怪的行为。 如果我将第一个数据包发送到设备,它不会接收到它, 继续使用“ds.接收(dp);”。 然后程序接收下一个数据包好的, 如果我发送的时间间隔小于20秒。 但在发送延迟约20秒后,它会再次停止接收。 然后它再次接收下一个数据包

    public class UDP_Server {
    private AsyncTask<Void, Void, Void> async;
    int udp;
    private boolean serverActive = true;
    InetAddress inetAddress;

    @SuppressLint("NewApi")
    public void runUdpServer(int udp1) {
        udp=udp1;
        async = new AsyncTask<Void, Void, Void>() {
            @Override
            protected Void doInBackground(Void... params) {
                byte[] lMsg = new byte[2048];
                DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
                DatagramSocket ds = null;
                My.saveLog("start receive ");

                try {
                    ds = new DatagramSocket(udp);

                    while (serverActive) {
                        My.saveLog("start receive2 ");
                        ds.setSoTimeout(0);
                        ds.receive(dp);
                        My.saveLog("start receive3");

                        ...

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (ds != null) {
                        ds.close();
                    }
                }

                return null;
            }
        };

        if (Build.VERSION.SDK_INT >= 11) async.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        else async.execute();
    }

    public void stop_UDP_Server() {
        serverActive = false;
    }
}
公共类UDP\u服务器{
私有异步任务异步;
int-udp;
private boolean serverActive=true;
InetAddress InetAddress;
@SuppressLint(“新API”)
公共void runUdpServer(int udp1){
udp=udp1;
async=新的AsyncTask(){
@凌驾
受保护的Void doInBackground(Void…参数){
字节[]lMsg=新字节[2048];
DatagramPacket dp=新的DatagramPacket(lMsg,lMsg.length);
DatagramSocket ds=null;
My.saveLog(“开始接收”);
试一试{
ds=新的DatagramSocket(udp);
while(服务器活动){
My.saveLog(“开始接收2”);
ds.setSoTimeout(0);
ds.接收(dp);
My.saveLog(“开始接收3”);
...
}
}捕获(例外e){
e、 printStackTrace();
}最后{
如果(ds!=null){
ds.close();
}
}
返回null;
}
};
if(Build.VERSION.SDK\u INT>=11)async.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR);
else async.execute();
}
公共无效停止\u UDP\u服务器(){
serverActive=false;
}
}
有什么想法吗

更新:我运行了客户端,它是从Win7在.NETC#上编写的。 当我在Win7上使用Linux映像从VMWare运行类似的UDP Linux客户端时 没问题。问题是在客户端。。。
奇迹…

这种行为是一致的还是随机丢失的?我经常看到这种行为。我的手机没有进入睡眠模式。我从另一个设备发送UDP数据包。我的意思是每隔几秒钟手动发送一个数据包您确定您的发送解决方案不是分组数据包吗?我每隔几秒钟手动发送数据包。当然问题出在客户身上。我用的是c#app,同样的Linux应用客户端也可以。请看我上面的更新。谢谢