0

我正在尝试使用异步连接实现客户端应用程序。我想知道在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()方法始终返回 true(即使我尝试完成连接)

唯一的解决方案是摆脱这个SocketChannel并创建一个新的吗?

4

3 回答 3

1

Sun 已根据 GPL 发布了 Java 6.0 源代码。 “阅读源卢克”

我对代码的阅读是您不能再次调用 connect 。

于 2009-11-11T23:36:46.260 回答
0

嗯...我不是 NIO 专家,但有些东西看起来很可疑。您正在注册 OP_ACCEPT,这在侦听通道接收传入连接时发生 - 但是,您正在使用该通道进行传出连接。

您应该发布更多代码,包括选择循环。

于 2009-11-11T22:09:12.987 回答
0

试试看?

我不是 100% 确定,但我怀疑一旦调用并返回了 finishConnect 或者抛出异常,你就可以了。

在连接周围放置一个 try/catch 块,当异常被捕获时,您可以安全地再次调用 channel.connect 方法。

如果它不起作用,那么答案可能是否定的。

于 2009-11-11T23:54:32.460 回答