2013-01-07 31 views
1

我正在使用字節數組來存儲從另一臺計算機接收到的數據包。字節數組:如何確切知道接收到的字節數

receivedData = new byte[1024]; 
receivedPacket = new DatagramPacket(receivedData, receivedData.length); 
socket.receive(receivedPacket); 
receivedData = receivedPacket.getData(); 
String res = new String(receivedData); // PROBLEM HERE 

問題是在最後一行:因爲我宣佈receivedData與長度1024這樣一個字節流,總是在最後一行將創建一個從整個陣列的新字符串,雖然它不知道到底有多少真正的我收到的字節。所以,我遇到了沮喪的錯誤:res沒有收到,因爲我希望。 (因爲我收到的實際字節長度不能修復整個陣列)

所以,我的問題是:我該如何解決這一問題,我怎麼知道我真的收到了多少字節轉換爲字符串?

+0

最初我認爲你可以把receivedPacket放入一個對象中,然後根據被轉換爲byte []的對象的長度來創建字節數組。之後創建字符串。 –

回答

4

嘗試使用DatagramPacket.getLength()

receivedData = new byte[1024]; 
receivedPacket = new DatagramPacket(receivedData, receivedData.length); 
socket.receive(receivedPacket); 
receivedData = receivedPacket.getData(); 
String charsetName = "US-ASCII"; // set to desired charset 
String res = new String(receivedData, 0, receivedPacket.getLength(), charsetName); 

編輯添加字符集。謝謝,parsifal

+1

請注意,這在創建字符串時依賴於默認編碼,這可能是難以解決錯誤的根源。 – parsifal

2

javadocDatagramSocket.receive()

The length field of the datagram packet object contains the length of the received message

可以使用,需要一個字節數組和偏移量構造,然後構建你的String

2

請致電DatagramPacket.getLength()找出實際收到的字節數。

而當你從這些字節構建String一定要指定編碼(因爲它是,你正在使用JDK的默認編碼,可以從服務器的編碼方式不同)。