2009-07-24 3 views
15

In Server, ho inviare un array di byte al cliente attraverso presa JavaSocket inviare e ricevere array di byte

byte[] message = ... ; 

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

Come posso ricevere questo array di byte dal client?

risposta

6

Innanzitutto, non utilizzare DataOutputStream a meno che non sia realmente necessario. Secondo:

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

Ovviamente a questo manca qualsiasi controllo degli errori ma questo dovrebbe farti andare avanti. Il JDK API Javadoc è tuo amico e può aiutarti molto.

+2

non vedo come questo risponde l'invio e la ricezione di ** ** sulla stessa presa. – m0skit0

+4

perché non utilizzare DataOutputStream? sta aggiungendo un sovraccarico significativo? – vach

3

Esiste un tutorial per socket JDK here, che copre sia il server che il client. Sembra esattamente come vuoi tu.

(da tale istruzione) Questo imposta per leggere da un server di eco:

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

prendendo un flusso di byte e converte in stringhe tramite il lettore e utilizzando una codifica predefinita (sconsigliabile, normalmente).

Errore durante la gestione e la chiusura di socket/flussi omessi da quanto sopra, ma controllare il tutorial.

+2

BufferedReader non ti permette di leggere l'input come un byte [] fa? – user12345613

1

È necessario che il messaggio sia di dimensioni fisse o che sia necessario inviare le dimensioni o utilizzare alcuni caratteri separatori.

Questo è il caso più semplice per una dimensione nota (100 byte):

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

In questo caso DataInputStream senso in quanto offre readFully(). Se non lo si utilizza, è necessario eseguire un ciclo fino a quando non viene letto il numero previsto di byte.

45

Prova questo, funziona per me.

mittente:

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 


Ricevitore:

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); e dOut.write (messaggio); è il vincitore. Grazie @franta –

+0

grazie, ho risparmiato un sacco di tempo –