2015-11-11 71 views
0

我試過接收帶有固定緩衝區大小的數據報包,然後想根據接收包進行調整。我可以得到接收數據包的實際緩衝區大小,但是當我將它寫入具有調整大小的另一個緩衝區時,它會再次更改或增大其大小。這怎麼可能呢?我期望它拋出數組超出界限的異常。數據報包接收緩衝區大小-java

byte[] recvbuffer=new byte[1024]; 
byte[] databuf=new byte[k-8]; 
byte[] checksumbuf=new byte[8]; 

recvpacket[i]=new DatagramPacket(recvbuffer,recvbuffer.length); 
sock.receive(recvpacket[i]); 
System.out.println(new String(recvbuffer));//1 

int k=recvpacket[i].getLength();//k=28 
System.out.println(k); 

byte[] buffer=new byte[k];//buffer of size 28 
System.out.println(buffer.length); 
buffer=recvbuffer; 
//buffer=recvpacket[i].getData(); 
System.out.println(new String(buffer));//buffer of size 1024, but how? 
System.out.println(buffer.length);// 

回答

2

不要這樣做。只需將其設置爲預期的最大數據報大小加1。然後,如果你得到一個這樣的大小,這是一個協議錯誤(可能會更大)。

當您處理接收到的DatagramPacket,你應該通過DatagramPacket.getLength().利用其實際長度例如,您

System.out.println(new String(recvbuffer));//1 

應該

System.out.println(new String(recvpacket[i].data(), 0, recvpacket[i].getLength())); 
+0

我得到的數據包作爲數據包的長度。的getLength();但我的問題是,我如何將緩衝區寫入到已定義大小的新緩衝區中。我應該寫它像byte [] buf = new byte [recvpacket [i] .getLength()+ 1] – Struse

+0

或多或少,除了虛假的+1,但爲什麼?通常情況下,你會在包數據的周圍包裝一個'ByteArrayInputStream',並且可能包含一個'DataInputStream',並通過各種形式的'readXXX()'方法獲取數據。不需要第二個字節數組。 – EJP