2015-04-20 102 views
1

我發送一個UDP數據報只有一個字符串的內容和我創建的包是這樣的:Java:爲什麼我的字符串通過UDP損壞?

String content = ALIVE + "," + clusterName + "," + nodeName + "," + location; 
byte[] data = content.getBytes(); 
packet = new DatagramPacket(data, data.length); 

的問題是,當它到達它在最後有一些奇怪的二進制數據,不能顯示爲字符(在Sublime Text中它只顯示幾個NUL符號)。

String data = new String(packet.getData()); 

我提取不同的信息部分與字符串標記(,)和發送之前剛剛加入另一個,在年底,現在解決了這個問題。不過,我想知道,這些數據來自哪裏?

+0

可能與此有關? HTTP://計算器。com/questions/8229064 /如何擺脫空的剩餘緩衝區 – Ravi

回答

1

仔細聽取答案,建議您在兩端都明確指定字符編碼。他們的建議非常好。

但是,如果字符數據被準確接收,但在最後添加了一些垃圾,那麼您的問題不太可能由字符編碼不匹配引起。更可能是由於接收器錯誤地使用了DatagramPacket

DatagramPacket爲消息提供了一個固定長度的緩衝區,並且getData()方法返回該緩衝區。如果它比最近收到的消息長,那麼尾端將包含與該消息無關的數據。收到消息後,必須使用數據包的getLength()方法確定緩衝區中有多少個字節與該消息相對應。

+0

謝謝,這工作完美。 (String data = new String(packet.getData(),0,packet.getLength());) –

1

從來沒有,請致電String.getBytes()或只需要byte[]的構造函數。

始終在兩側傳遞明確的字符集。

由於您的代碼是當前編寫的,發件人可以生成一個編碼的字節,讀者可以(錯誤地)將它們解釋爲某種其他編碼,從而生成各種風格的垃圾。

您可能還有其他問題。

+0

好的建議,但它沒有回答這個問題。 –

+0

噢?你確定OP沒有遭受來自不匹配字符集的數據損壞嗎? – bmargulies

+0

不,我不確定(雖然我覺得從描述中可疑)。你也不是。不過,編輯改進了答案。 –

1

您正在將字符轉換爲一端的字節,並將字節轉換爲另一端的字符。一切都很好,但你沒有指定正在使用的字符編碼,如果那些不匹配,字節/字符轉換將而不是正常工作。

你有兩個選擇:

  1. 與適當的字符指定的轉換設置
  2. 強制使用容易混淆的命名-Dfile.encoding JVM參數JVM所使用的默認編碼

我寧願第一個選項,因爲您可能沒有在你的代碼是如何執行的,或者(例如,如果你的代碼被提升到一個庫中的其他地方使用)

1

您可以指定角色控制這樣明確設置:

byte[] data = content.getBytes(StandardCharsets.UTF_8);