Укажите время ожидания соединения в java.nio - PullRequest
7 голосов
/ 02 апреля 2010

При использовании неблокирующего ввода-вывода код для подключения к удаленному адресу выглядит примерно так:

SocketChannel channel = SelectorProvider.provider().openSocketChannel();
channel.configureBlocking(false);
channel.connect(address);

Процесс подключения должен быть завершен путем вызова finishConnect() на канале, когда какой-то селектор произносит соответствующую клавишу isConnectable().

Есть ли способ указать время ожидания соединения при использовании этой идиомы?

Ответы [ 2 ]

1 голос
/ 28 февраля 2013

Вопрос на самом деле не имеет смысла. Тайм-ауты для режима блокировки. Если вы хотите, оставьте канал в режиме блокировки и наберите channel.socket().connect(address, timeout);. Если вы хотите неблокирующий режим, используйте свой текущий код; затем создайте селектор; зарегистрировать канал на OP_CONNECT; когда вы получите его, позвоните finishConnect(),, и если это вернет true, отмените регистрацию OP_CONNECT и продолжите работу с остальным кодом.

0 голосов
/ 02 апреля 2010

Интересный вопрос. Я не уверен, что nio сама предлагает решение.

По своему опыту я запустил Callable, чтобы попытаться установить соединение, а затем использовал Future для опроса ответа, используя переменные 'interval' и 'timeout' для зацикливания и Thread.sleep () для ответа.

Надеюсь, это укажет вам полезное направление ...

Кроме того, я предлагаю вам взглянуть на Apache Mina (вы можете описать Mina как фреймворк nio). Он обрабатывает много такого рода вещей для вас, например, в StreamIoHandler http://mina.apache.org/report/trunk/apidocs/org/apache/mina/handler/stream/StreamIoHandler.html

...