2009-07-24 23 views
15

En el servidor, tengo que enviar una matriz de bytes en el cliente a través del zócalo de Javazócalo enviar y recibir matriz de bytes

byte[] message = ... ; 

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

¿Cómo puedo recibir esta matriz de bytes desde el cliente?

Respuesta

6

Primero, no use DataOutputStream a menos que sea realmente necesario. Segundo:

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

Por supuesto, esto no tiene ningún error de comprobación, pero esto debería ponerlo en marcha. El JDK API Javadoc es tu amigo y puede ayudarte mucho.

+2

No veo cómo este responde enviando y recibiendo ** ** en el mismo socket. – m0skit0

+4

¿por qué no usar DataOutputStream? ¿está agregando algunos gastos indirectos significativos? – vach

3

Hay un tutorial de socket JDK here, que abarca tanto el servidor como el cliente final. Eso se ve exactamente como lo que quieres.

(de que tutorial) Esto configura para leer desde un servidor de eco:

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

tomando una corriente de bytes y se convierte en cadenas a través del lector y usando una codificación predeterminada (no aconsejable, normalmente).

Error al manejar y cerrar los sockets/streams omitidos de los anteriores, pero consulte el tutorial.

+2

BufferedReader no le permite leer la entrada como un byte [] ¿verdad? – user12345613

1

Es necesario que el mensaje sea de un tamaño fijo, o que necesite enviar el tamaño o que necesite utilizar algunos caracteres de separación.

Este es el caso más fácil para un tamaño conocido (100 bytes):

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

En este caso DataInputStream tiene sentido, ya que ofrece readFully(). Si no lo usa, debe realizar un bucle hasta que se lea el número de bytes esperado.

45

Pruebe esto, está funcionando para mí.

remitente:

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 


receptor:

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 
} 
+1

dOut.writeInt (message.length); y dOut.write (mensaje); es el ganador. Gracias @franta –

+0

gracias, ahorré mucho de mi tiempo –

Cuestiones relacionadas