2012-11-21 63 views
2

我在andorid上創建UDP服務。 對於代碼的清晰度部分複製在這裏:UDP數據包分離

byte[] message = new byte[1500]; 
    DatagramPacket packet = new DatagramPacket(message, message.length);      
    socket = new DatagramSocket(Constants.LISTENING_PORT_NUMBER); 
    socket.receive(packet); 

問題是,我不斷收到UDP報文。例如數據包#1(250字節長),數據包#2(182字節長),數據包#3(403字節長)等...

我需要獲取和處理單獨的UDP數據包,長度。 根據UDP協議規範,UDP數據包定義了消息邊界。 但是我發現Java中沒有可以分離UDP數據包的解決方案。

在我當前的解決方案中,我必須定義必須讀取的數據包長度,但在收到數據包之前我不知道數據包的長度。

我錯過了一個觀點嗎?


編輯: 感謝兩個托比亞斯和shazin都是正確答案。悲傷我不能標記兩個答案是正確的。

socket.receive(packet);將接收到UDP包的邊界,隨後的包可以用另一個socket.receive(packet);讀取。
我的問題應該是,在第一條消息的過程中,由於同步處理而未處理到達的進一步消息,現在我將消息處理傳遞給異步任務,並且希望能夠及時地捕獲所有到達的數據包。

+0

我相信無論你設置什麼,當你收到數據包時都會被重寫。堅持'直到我拿起文件。 –

+0

爲什麼你會使用udp? tcp具有數據包序列和整理保險 – njzk2

+0

@ njzk2實時流數據,您更喜歡時間超過可靠性。 –

回答

1

也許我在這裏丟失了一些東西,但DatagramPacket一個發送的數據包。它有getLength()getOffset()方法需要的數據。我相信還有一個返回發送數據的getData()

這裏您有一個link這可以幫助您進一步。

+0

你好,DatagramPacket的構造函數需要提供的長度參數,所以getLength()會返回緩衝區的長度 – Sandor

+0

這是最大長度,而不是數據包的長度。 –

+0

好的你是對的,我的問題是由於同步處理,後續的數據包丟失並且未被應用程序處理。 – Sandor

2

您無法預先知道數據包的長度。您可以根據您可能收到的數據定義最大邊界字節數組。建議使用2048字節的數組。

byte[] message = new byte[2048]; 

即使你有傳入消息分組可變長度,則可以使用下面的代碼來接收

byte[] message = new byte[2048]; 
DatagramPacket packet = new DatagramPacket(message, message.length);      
socket = new DatagramSocket(Constants.LISTENING_PORT_NUMBER); 
socket.receive(packet); 
String data = new String(packet.getData(), 0, packet.getLength()); 

的getData和的getLength方法可用於確定所接收的分組的大小。

+0

你理所當然地認爲偏移量是0.我認爲你不能這樣做。 –

+0

@TobiasRitzau,你是什麼意思? –

+0

'new String()'中的0應該是'packet.getOffset()',對吧? –