web-dev-qa-db-fra.com

Tableau d'octets d'envoi et de réception de socket

Dans le serveur, j'ai envoyé un tableau d'octets au client via Java

byte[] message = ... ;

DataOutputStream dout = new DataOutputStream(client.getOutputStream());
dout.write(message);

Comment puis-je recevoir ce tableau d'octets du client?

23
quan

Essayez ça, ça marche pour moi.

Expéditeur:

byte[] message = ...
Socket socket = ...
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());

dOut.writeInt(message.length); // write length of the message
dOut.write(message);           // write the message


Destinataire:

Socket socket = ...
DataInputStream dIn = new DataInputStream(socket.getInputStream());

int length = dIn.readInt();                    // read length of incoming message
if(length>0) {
    byte[] message = new byte[length];
    dIn.readFully(message, 0, message.length); // read the message
}
60
franta kocourek

Tout d'abord, n'utilisez pas DataOutputStream sauf si c'est vraiment nécessaire. Seconde:

Socket socket = new Socket("Host", port);
OutputStream socketOutputStream = socket.getOutputStream();
socketOutputStream.write(message);

Bien sûr, cela ne comporte aucune vérification d'erreur, mais cela devrait vous permettre de continuer. JDK API Javadoc est votre ami et peut vous aider beaucoup.

8
Bombe

Il existe un didacticiel sur les sockets JDK ici , qui couvre à la fois le serveur et le client. Cela ressemble exactement à ce que vous voulez.

(à partir de ce tutoriel) Cela permet de lire à partir d'un serveur d'écho:

    echoSocket = new Socket("taranis", 7);
    out = new PrintWriter(echoSocket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(
                                echoSocket.getInputStream()));

en prenant un flux d'octets et converti en chaînes via le lecteur et en utilisant un encodage par défaut (déconseillé, normalement).

Erreur de gestion et de fermeture des sockets/flux omis de ce qui précède, mais consultez le didacticiel.

3
Brian Agnew

Vous devez soit avoir un message de taille fixe, soit envoyer la taille, soit utiliser des caractères de séparation.

C'est le cas le plus simple pour une taille connue (100 octets):

in = new DataInputStream(server.getInputStream());
byte[] message = new byte[100]; // the well known size
in.readFully(message);

Dans ce cas, DataInputStream est logique car il offre readFully(). Si vous ne l'utilisez pas, vous devez vous boucler jusqu'à ce que le nombre d'octets attendu soit lu.

1
eckes