簡體   English   中英

Android是否為DatagramSocket排隊UDP數據包?

[英]Does Android queue UDP packets for DatagramSocket?

我最近在我的Android(特別是2.3.3和4.0.4)應用程序中實現了UDP數據包排序支持,該應用程序在設備之間廣播UDP數據包。 排序支持基本上采用任何byte []並將其組合成UDP友好大小並將其作為UDP數據包發送出去。 我包含的標題有助於UDP序列識別。 現在看起來好像通過它廣播大數據集是有效的。 任何監聽它的對等體都可以重新組合序列,然后相應地處理數據。 (我正在播放用相機和語音片段拍攝的圖像)

我發現雖然偶爾(通常)序列中的數據包將被丟棄。 在有人說UDP不可靠之前,不要打擾。 我很清楚。 這里發生的事情不一定是不可靠的。

首先,UDP數據包排序將每2秒發送1個分段的UDP數據包。 例如,如果數據是128K,則將有3個數據包,在6秒的時間段內發送出去。 2秒的數字是為了幫助測試。

其次,我在隔離的測試環境中只有2個設備。 他們是測試wifi網絡中唯一的。

第三,這些設備除了測試發送和接收這些UDP數據包之外什么都不做。

第四,我的日志記錄跟蹤每個數據包的唯一基於序列的ID。 它有助於確定發送方在序列中發送的數據包以及接收方接收的數據包。

我無法向您顯示日志,它無濟於事,但發件人會注意到每個數據包都已廣播,而接收器將丟棄一個,可能在任何時候。 有時接收器會獲得所有東西,有時它會丟失一個。

現在我已經解釋了這一切,Android隊列是否收到了處理套接字的UDP數據包?

我不認為接收器太忙而無法接受UDP數據包。 (它們每2秒發送一次)

目前我的服務啟動一個基本上在DatagramSocket.receive()上循環的Runnable,然后相應地處理收到的數據包。

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());
        }
    }
}

在我的日志中,我將逐字地看到:(這是我日志中的剪輯,而不是直接來自上面代碼片段的輸出)

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秒發送一次所有數據包。 您可以在時間碼中看到在1:26:35收到數據包19,並在1:26:39收到數據包21。 (中間4秒)

我有點不知所措。 Android和UDP數據包丟失是否存在已知問題? Android / Java UDP堆棧隊列在一段時間內收到的數據包是服務是否忙於處理其他數據包?

除了切換到TCP之外的任何建議都會有所幫助。 提前致謝!

好的,我解決了我的問題。

我將我的應用程序服務中的直接單個ScheduledExecutorService + Runnable線程切換到Runnable,它將生成新的ExecutorService Runnables來處理收到的DatagramPacket。 我猜我的接收器中有一點I / O延遲/阻塞,並將其分成一個單獨的線程來處理分組數據似乎工作。 我使用新方法在設備之間傳輸了1.8MB大小的數據測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM