повторное использование сокетных каналов - PullRequest
0 голосов
/ 12 ноября 2009

я пытаюсь реализовать клиентское приложение с асинхронным соединением. я хочу знать, могу ли я повторно использовать объект SocketChannel после того, как ему не удалось подключиться к серверу.

    SocketChannel channel = SocketChannel.open();
    channel.configureBlocking(false);
    InetSocketAddress addr = new InetSocketAddress(host, port);
    SelectionKey key = channel.register(select, SelectionKey.OP_READ, connection);
    channel.connect(addr);

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

это единственное решение, избавиться от этого SocketChannel и создать новое?

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

Sun выпустила источники Java 6.0 под лицензией GPL. «Читай источник, Люк»

И мое прочтение кода таково, что вы не можете позвонить, подключитесь во второй раз.

0 голосов
/ 12 ноября 2009

Попробуй и увидишь?

Я не уверен на 100%, но я подозреваю, что вы можете, как только будет вызвано и возвращено finishConnect, или исключение из него может быть в порядке.

Поместите блок try / catch вокруг соединения, и когда исключение будет перехвачено, вы можете снова вызвать метод channel.connect.

Если это не сработает, то ответ, вероятно, нет.

0 голосов
/ 12 ноября 2009

Хммм ... Я не эксперт NIO, но что-то выглядит подозрительно. Вы регистрируетесь для OP_ACCEPT, который происходит, когда прослушивающий канал получает входящее соединение - однако вы используете канал для исходящего соединения.

Вы должны опубликовать больше кода, включая цикл выбора.

...