2017-06-09 35 views
2

在用于插座下面的代码,我声明一个字节缓冲器而在一个循环中监听客户端的消息:将字节[]缓冲区重置为零?

// Create some buffer 
byte[] buffer = new byte[512]; 

while (true) 
{ 
    // Listen for messages from Client 

    int length = socket.getInputStream().read(buffer); 

    if (length != -1) 
     System.out.println(new String(buffer)); 
    else 
     break; 

    // Reset buffer here to zeros? 
} 

每次我需要重置缓冲器的内容以接收新的消息。什么是正确的方法来做到这一点?

+0

这不是接收通过串一种可靠的方法插座。不能保证一个完整的编码字节数组将在单个'read()'调用中返回。使用'DataInput/DataOutput''readUTF()/ writeUTF()'或其他同样可靠的东西。 –

+0

@JamesKPolk:或者我可以传递字节长度.. – user963241

+0

是的,这可以工作,特别是如果您使用'DataInput/DataOutput'方法,例如'readInt()/ writeInt()'和'readFully() '。 –

回答

3

你并不需要重置缓冲区,你需要一个String构造不晃过已接收字节的缓冲区部分的结尾:

if (length != -1) { 
    System.out.println(new String(buffer, 0, length)); 
} 

现在,您的代码将即使缓冲区很脏也可以工作。

注意:为了更好的便携性,将所需的Charset传递给String构造函数。否则,您构造的String可能与通过套接字传输给您的字符串不匹配。

1

同意dasblinkenlight answers,而是要回答这个问题本身(如何复位数组),你可以使用Arrays.fill的值设置为每一个细胞

byte[] array = new byte[10]; 
Arrays.fill(array, (byte)0);