2011-12-19 55 views
4

嘗試將收到的DatagramPacket轉換爲字符串,但我遇到了一個小問題。不知道什麼是最好的方式去做。DatagramPacket字符串

我將收到的數據大部分是未知長度,因此我在接收端設置了一些緩衝區[1024]。問題是,假如我送字符串 「abc」,並且做我的接收機側下面...

buffer = new byte[1024]; 
packet = new DatagramPacket(buffer, buffer.length); 
socket.receive(packet); 
buffer = packet.getData(); 
System.out.println("Received: "+new String(buffer)); 

我得到以下輸出:ABC [] [] [] [] [] [] [] .....一路緩衝區的長度。 我猜所有垃圾/ null在最後應該被忽略,所以我必須做錯了什麼。「我知道buffer.length是問題,因爲如果我改變它爲3(對於這個例子),我走出來了就好了。

感謝。

回答

8
new String(buffer, 0, packet.getLength()) 
+0

不幸的是,沒有工作。外面變得完全荒謬。而且eclipse還警告不推薦使用方法String(byte [],int)。當我初始化緩衝區的時候,它的確切長度是可以接收的,但一切都很好,但仍然存在相同的問題。字符串的長度不會事先知道。 – user1105216 2011-12-19 05:27:47

+0

這確實工作,但新的字符串(緩衝區,0,packet.getLength()); 非常感謝。 – user1105216 2011-12-19 05:45:44

2

的DatagramPacket類的長度字段給出實際收到的數據包的長度。請參閱javadocDatagramPacket.receive瞭解更多詳情。

所以只需需要使用不同的String構造函數,傳遞字節數組和實際的re通過字節計數。

請參閱@jtahlborn或@ GiangPhanThanhGiang的答案。


但是,這仍然會導致在將字節解碼爲UTF-16字符串時應該使用哪種字符編碼的問題。對於您的特定示例,它可能並不重要。但是它傳遞的數據可能包含非ASCII字符,那麼您需要使用正確的字符集進行解碼。如果出現錯誤,您的String值中可能會出現亂碼。

0

據我所知,DatagramPacket最後只有一堆垃圾。正如Stephen C.建議的那樣,您可能能夠找到收到的實際長度。在這種情況下,使用:

int realSize = packet.getLength() //Method suggested by Stephen C. 
byte[] realPacket = new byte[realSize]; 
System.arrayCopy(buffer, 0, realPacket, 0, realSize); 

至於找到長度,我不知道。

+0

如果您打算投降,請解釋爲什麼我可以在下次修復我的帖子。簡單的投票並沒有幫助。 – 2011-12-19 15:28:17

+2

你原來的答案沒有提供任何有關獲取包長度的有意義的信息,這基本上是問題所在。另外,一旦您知道數據包長度,就不需要複製數組。 – jtahlborn 2011-12-19 18:52:17

+0

複製是爲了將緩衝區大小從1024減少到數據包大小。 – 2011-12-19 23:30:37

-2

使用此代碼,而不是

buffer = new byte[1024]; 
packet = new DatagramPacket(buffer, buffer.length); 
socket.receive(packet); 
String data = new String(packet.getData()); 
System.out.println("Received: "+data); 
+0

使用此代碼爲什麼?單純的代碼不是答案。你必須解釋。這個特定的代碼不會比OP的原始代碼更好,因爲它在語義上是相同的。 – EJP 2017-01-07 06:06:38

1

使用此代碼來代替: String msg = new String(packet.getData(), packet.getOffset(), packet.getLength());

0

嘗試

System.out.println("Received: "+new String(buffer).trim()); 

String sentence = new String(packet.getData()).trim(); 
System.out.println("Received: "+sentence);