2011-08-25 13 views
5

Sto utilizzando un BufferedInputStream per leggere da un socket. Il BufferedInputStream recita:BufferedInputStream e Blocking

socketInput.read(replyBuffer, 0, 7); 

Si istanziata da

socketInput = new BufferedInputStream(mySocket.getInputStream()); 

mySocket è definito come private Socket mySocket;

mySocket viene istanziata da mySocket = new Socket(ipAddress, port);

Ho verificato che mySocket è collegato a il mio dispositivo. Posso inviare dati al mio dispositivo; tuttavia, non ricevo dal mio dispositivo per motivi sconosciuti, ma non è questo il problema.

Desidero restituire il valore BufferedInputStream dopo 100ms se non legge alcun dato. È possibile impostare BufferedInputStream per farlo? In questo momento, blocca indefinitamente.

+1

Se si desidera qualsiasi tipo di I/O non bloccante o di timeout, è necessario utilizzare le classi NIO ('java.nio'), non roba in' java.io'. –

risposta

3

In genere è una cattiva idea utilizzare un flusso bufferizzato per la lettura da un socket, proprio per questo motivo: aspetterà per sempre se non vede abbastanza dati da riempire il suo buffer interno (che sarà più grande di 7 caratteri!) Non c'è modo di farlo fuori tempo. Basta usare direttamente lo SocketInputStream e il problema scompare.

+0

quindi stai raccomandando socket.getInputStream.read (..)? –

+3

Sì, è tutto. Quindi puoi usare 'setSoTimeout()', come suggerito da un altro poster, e otterrai il comportamento che desideri. –

+0

grazie - ha funzionato! –

4

Specificare un timeout di 100 ms per la presa. setSoTimeout

+0

è ancora valido se sto utilizzando un BufferedInputStream? –

+0

Quello che succederà è che otterrai una 'SocketTimeoutException' dalla tua chiamata' read() ', anche se in realtà c'erano abbastanza byte per soddisfare la tua richiesta. Questo non è buono. –

+0

@Code Monkey è ancora valido per qualsiasi wrapping InputStream. – umbr

Problemi correlati