首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android会为DatagramSocket排队UDP数据包吗?

Android会为DatagramSocket排队UDP数据包吗?
EN

Stack Overflow用户
提问于 2013-09-24 04:20:30
回答 1查看 2.6K关注 0票数 4

我最近在我的Android (特别是2.3.3和4.0.4 )应用程序中实现了对UDP数据包排序的支持,该应用程序可以在设备之间广播UDP数据包。排序支持基本上将任何byte[]分块成UDP友好的大小,并将它们作为UDP包发送出去。我包含了一个标头,它可以帮助识别UDP序列。现在看来,通过它广播一个大型数据集是可行的。任何监听它的对等点都可以很好地重组序列,然后相应地处理数据。(我正在播放用摄像机和语音剪辑拍摄的图像)

但我发现,序列中的数据包偶尔(通常)会被丢弃。在有人说UDP不可靠之前,别费心了。我很清楚。这里发生的事情不一定是不可靠的。

首先,UDP数据包排序将每2秒发送1个分段UDP数据包。例如,如果数据是128K,将有3个包,在6秒周期内发送出去。第二个数字是帮助测试。

其次,在我的隔离测试环境中,我只有2个设备。他们是唯一在测试wifi网络上的人。

第三,这些设备除了测试发送和接收这些UDP数据包之外,什么也不做。

第四,我的日志记录为每个包跟踪一个唯一的基于序列的ID。它有助于确定发送者按顺序发送了哪个数据包,以及接收者接收了哪个数据包。

我不能给你展示日志,这不会有什么帮助,但发送者会注意到每个包都已经广播了,而接收者可能会在任何时候丢弃一个。有时接收器得到了一切,有时却少了一个。

现在我已经解释了所有这些,Android queue是否接收到处理套接字的UDP数据包?

我不认为接收器太忙而无法接受UDP数据包。(每2秒发送一次)

目前,我的服务启动了一个基本上在DatagramSocket.receive()上循环的Runnable,然后相应地处理接收到的数据包。

代码语言:javascript
运行
复制
public class MulticastListenerRunnable implements Runnable {
    ...
    public void run() {
        try {
            multicastServer = new DatagramSocket(port, null);
            byte[] buffer = new byte[DatagramSession.DATAGRAM_MAX_SIZE];
            DatagramPacket packet = null;
            byte[] data;

            while(run) {
                try {
                    packet = new DatagramPacket(buffer, buffer.length);
                    packet.setLength(buffer.length);
                    multicastServer.receive(packet);
if(packet.getAddress().getHostAddress().equals("127.0.0.1") || packet.getAddress().getHostAddress().equals(ipAddress)) {
                        continue;
                    }
                    Log.d(TAG, "START PACKET RECEIVE!");
                    processPacket(packet);
            }
        } catch (IOException e) {
            Log.e(TAG, e.getMessage());
        } catch (Exception e) {             
            Log.e(TAG, e.getMessage());
        }
    }
}

在我的日志中,我会从字面上看到:(这是我的日志中的一个片段,而不是直接来自上面代码片段的输出)

代码语言:javascript
运行
复制
03-21 01:26:35.453: D/CommService(6446): START PACKET RECEIVE!
03-21 01:26:35.507: D/CommService(6446): RECEIVED PACKET:  19 of 28 -> 64977(65000 max)
03-21 01:26:35.515: D/CommService(6446): RECEIVED PACKET: This packet isn't alone. More to come!
03-21 01:26:35.515: D/CommService(6446): END PACKET RECEIVE!


03-21 01:26:39.460: D/CommService(6446): START PACKET RECEIVE!
03-21 01:26:39.468: W/DatagramSession(6446): Warning, this packet's sequence isn't in order, last -> 18, new -> 20
03-21 01:26:39.476: D/CommService(6446): RECEIVED PACKET: This packet isn't alone. More to come!
03-21 01:26:39.476: D/CommService(6446): END PACKET RECEIVE!

请注意,分组20丢失。如果我查看我的发送者设备的日志,我会看到他每2秒发送一次所有数据包。您可以在时间代码中看到,数据包19在1:26:35接收,数据包21在1:26:39接收。(间隔4秒)

我有点不知所措。Android和UDP丢包是否存在已知问题?Android/Java UDP堆栈是否会将接收到的数据包排队一段时间?是否该服务正忙于处理其他数据包?

除了切换到TCP之外,任何其他建议都会很有帮助。提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2013-09-24 23:14:34

好了,我解决了我的问题。

我将我的应用程序服务中直接的单个ScheduledExecutorService + Runnable线程切换为一个Runnable线程,它将产生新的ExecutorService Runnables来处理收到的DatagramPacket。我猜在我的接收器中有一个小的I/O延迟/阻塞,并且将它分成一个单独的线程来处理数据包数据似乎是有效的。我已经使用新的方法在设备之间传输了1.8MB大小的数据测试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18968102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档