Прочитанные неблокируемые сокеты Java - PullRequest
3 голосов
/ 24 августа 2010

Я использую DataInputStream для чтения символов / данных из сокета.

Я хочу использовать .readUnsignedShort ();и вызовите исключение, если нет 2 байтов для чтения.Должен ли я создать подкласс DataInputStream и переопределить методы, добавляющие исключения, или есть более простой способ?

Ответы [ 4 ]

7 голосов
/ 24 августа 2010

Если вы хотите что-то быстрое и грязное, попробуйте inputStream.available () .

if (stream.available() < 2) {
    // throw it
}

Если вам нужны истинные неблокирующие чтения и обратные вызовы, когда данные доступны, я думаю, что ответ Пабло лучше.

3 голосов
/ 24 августа 2010

Я думаю, что неблокирующие классы Java NIO - ваш лучший выбор. Проверьте класс SocketChannel и связанные с ним примеры кода.

Но будьте осторожны, когда вы запускаете команду чтения, может случиться так, что байты еще не доступны, но это не значит, что воля никогда не поступит в ваш сокет ...

2 голосов
/ 04 августа 2014
void readButDoNotBlockForALongTime(java.net.Socket socket) {
    int someTimeout = 1000;
    socket.setSoTimeout(someTimeout);
    try {
        // read as much as you want - blocks until timeout elapses
    } catch (java.net.SocketTimeoutException e) {
        // read timed out - you may throw an exception of your choice
    }
}

Это простой способ блокировать столько, сколько вы хотите.

setSoTimeout (int timeout): включить / отключить SO_TIMEOUT с указанным тайм-аутом в миллисекундах.Если для этой опции задано ненулевое время ожидания, вызов read () для InputStream, связанного с этим сокетом, будет блокироваться только на этот промежуток времени.Если время ожидания истекает, создается исключение java.net.SocketTimeoutException, хотя Socket все еще действует.Эта опция должна быть включена до начала операции блокировки, чтобы иметь эффект.Тайм-аут должен быть> 0. Тайм-аут, равный нулю, интерпретируется как бесконечный тайм-аут.

Для более элегантного решения вы можете рассмотреть возможность использования NIO.

0 голосов
/ 24 августа 2010

Если ввод заканчивается до подачи двух байтов, он вызывает исключение EOFException. Если нет доступного ввода (), он вернет ноль, хотя он также может вернуть ноль, если в некоторых случаях является вводом (например, SSL).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...