2009-09-17 12 views
11

Qual è il modo migliore per inviare un int tramite un socket in Java? In questo momento sto guardandoInvio int tramite socket in Java

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

e poi cercando di ricostruire l'int dal byte dall'altra parte, ma non sembra funzionare. Qualche idea?

Grazie.

+0

In generale, anche la tua strada dovrebbe funzionare, ma la risposta di Adam è migliore IMO. Tuttavia, il modo normale per farlo è ((lunghezza >> i) e (byte) 0xff) dove i è uno di (0, 8, 16, 24) che ti protegge dai problemi nel caso in cui il valore originale dell'intero sia negativo. – abyx

risposta

3

Ci sono altri tipi di flussi che è possibile utilizzare, che possono inviare direttamente numeri interi. È possibile utilizzare DataOutputStream. Osservare,

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

out.writeInt(5); 
26

Avvolgete il vostro OutputStream con un DataOutputStream e poi basta usare il metodo writeInt().

Un'altra cosa che può essere utile è che l'altra estremità si può avvolgere il nostro InputStream in un DataInputStream e utilizzare readInt() per leggere un int di nuovo fuori.

Entrambe le classi contengono anche una serie di altri metodi utili per la lettura e la scrittura di altri tipi non elaborati.

+0

Ovviamente il modo in cui doveva essere fatto. – abyx

+0

Solo se c'è anche Java dell'altra estremità. –

+0

@DenisTulskiy - l'altra estremità potrebbe essere qualsiasi lingua. DataOutputStream scrive quasi interamente l'output agnostico della lingua (eccetto le stringhe utf8). – jtahlborn

0

Se si inviano piccole quantità di dati, la codifica come dati di carattere (ad esempio Integer.toString(length)) e la decodifica all'altra estremità non è irragionevole.