2009-09-17 17 views
11

¿Cuál es la mejor manera de enviar un int a través de un socket en Java? En este momento estoy mirandoEnviando int a través del socket en Java

sockout.write((byte)(length >> 24)); 
sockout.write((byte)((length << 8) >> 24)); 
sockout.write((byte)((length << 16) >> 24)); 
sockout.write((byte)((length << 24) >> 24)); 

y luego tratar de reconstruir el int de bytes en el otro lado, pero no parece funcionar. ¿Algunas ideas?

Gracias.

+0

En general, su camino debería funcionar también, pero la respuesta de Adam es mejor IMO. Sin embargo, la forma habitual de hacerlo es ((longitud >> i) y (byte) 0xff) donde i es uno de (0, 8, 16, 24) que lo protege de los problemas en caso de que el valor original del entero sea negativo. – abyx

Respuesta

3

Hay otro tipo de transmisiones que puede usar, que pueden enviar enteros directamente. Puede usar DataOutputStream. Observar,

DataOutputStream out; 
try { 
    //create write stream to send information 
    out=new DataOutputStream(sock.getOutputStream()); 
} catch (IOException e) { 
    //Bail out 
} 

out.writeInt(5); 
26

Envuelva su OutputStream con un DataOutputStream y luego sólo tiene que utilizar el método writeInt().

Otra cosa que puede ser útil es que en el otro extremo se puede envolver nuestra InputStream en un DataInputStream y utilizar readInt() para leer un int de vuelta.

Ambas clases también contienen una cantidad de otros métodos útiles para leer y escribir otros tipos crudos.

+0

Obviamente, la forma en que estaba destinado a ser hecho. – abyx

+0

Solo si también hay Java del otro extremo. –

+0

@DenisTulskiy - el otro extremo podría ser cualquier idioma. DataOutputStream escribe casi en su totalidad salida de idioma independiente (excepto las cadenas utf8). – jtahlborn

0

Si envía pequeñas cantidades de datos, la codificación como datos de caracteres (por ejemplo, Integer.toString(length)) y la decodificación en el otro extremo no es irrazonable.

Cuestiones relacionadas