BufferedInputStream и блокировка

Я использую BufferedInputStream для чтения из сокета. BufferedInputStream читается следующим образом:

socketInput.read(replyBuffer, 0, 7);

Он создается

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

mySocket определяется как private Socket mySocket;

mySocket создается mySocket = new Socket(ipAddress, port);

Я убедился, что mySocket подключен к моему устройству. я могу отправлять данные на свое устройство; однако я не получаю с моего устройства по неизвестным причинам, но это не проблема.

Я хочу, чтобы мой BufferedInputStream возвращался, скажем, через 100 мс, если он не читает никаких данных. Можно ли настроить BufferedInputStream для этого? Сейчас он блокируется на неопределенный срок.


person Community    schedule 25.08.2011    source источник
comment
Если вам нужен какой-либо неблокирующий ввод-вывод или ввод-вывод с тайм-аутом, вы должны использовать классы NIO (java.nio), а не вещи в java.io.   -  person Chris Jester-Young    schedule 25.08.2011


Ответы (2)


Как правило, использовать буферизованный поток для чтения из сокета — плохая идея именно по этой причине: он будет ждать вечно, если не увидит достаточно данных для заполнения своего внутреннего буфера (который будет больше 7 символов!) Нет никакого способа сделать это тайм-аут. Просто используйте SocketInputStream напрямую, и проблема исчезнет.

person Ernest Friedman-Hill    schedule 25.08.2011
comment
поэтому вы рекомендуете вместо этого socket.getInputStream.read(..)? - person ; 25.08.2011
comment
Да это оно. Затем вы можете использовать setSoTimeout(), как предложил другой постер, и вы получите желаемое поведение. - person Ernest Friedman-Hill; 25.08.2011

Укажите тайм-аут 100 мс для вашего сокета. setSoTimeout

person umbr    schedule 25.08.2011
comment
это все еще действительно, если я использую BufferedInputStream? - person ; 25.08.2011
comment
Что произойдет, так это то, что вы получите SocketTimeoutException из вашего read() вызова, даже если на самом деле было достаточно байтов, чтобы удовлетворить ваш запрос. Это не хорошо. - person Ernest Friedman-Hill; 25.08.2011
comment
@Code Monkey по-прежнему действителен для любой упаковки InputStream. - person umbr; 25.08.2011
comment
@Ernest Friedman-Hill SocketTimeoutException выдает исключение, если данные недоступны. - person umbr; 25.08.2011