2015-11-11 69 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