2017-06-09 5 views
2

Dans le code ci-dessous pour les prises, je déclare un tampon d'octets et écouter les messages des clients dans une boucle:Réinitialiser octet [] tampon à zéros?

// 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? 
} 

Chaque fois que je nécessaire de rétablir le contenu du tampon pour recevoir un nouveau message. Quelle est la bonne façon de faire cela?

+0

Ce n'est pas un moyen fiable pour recevoir une chaîne sur une prise. Il n'y a aucune garantie qu'un tableau octet codé complet sera retourné dans un seul appel 'read()'. Utilisez 'DataInput/DataOutput'' readUTF()/writeUTF() 'ou quelque chose d'aussi fiable. –

+0

@JamesKPolk: ou je pourrais passer la longueur du message en octets .. – user963241

+0

Oui, cela pourrait fonctionner, surtout si vous utilisez les méthodes de 'DataInput/DataOutput' telles que' readInt()/writeInt() 'et' readFully() '. –

Répondre

3

Vous n'avez pas besoin de réinitialiser la mémoire tampon, vous devez un constructeur String qui ne va pas au-delà de la fin de la partie du tampon qui a les octets reçus:

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

maintenant votre code fonctionne même si le tampon est sale.

Remarque: Pour une meilleure portabilité, passez le constructeur Charset au constructeur String. Sinon, le String que vous construisez peut ne pas correspondre à la chaîne qui vous a été transmise via le socket.

1

D'accord avec dasblinkenlight answers, mais pour répondre à la question elle-même (comment réinitialiser un tableau), vous pouvez utiliser Arrays.fill pour définir une valeur pour chaque cellule

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