重用套接字通道

时间:2009-11-11 21:42:21

标签: java nio

我试图用异步连接实现客户端应用程序。我想知道在连接到服务器失败后是否可以重用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);

在这之后是select循环,我的套接字最终被选中,因为连接失败了。我想在该频道上排队另一次连接尝试,我似乎没有做任何事情。 channel.isConnectionPending()方法始终返回true(即使我尝试完成连接)

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

3 个答案:

答案 0 :(得分:1)

Sun已根据GPL发布了Java 6.0源代码。 "Read the source Luke"

我对代码的阅读是你不能第二次打电话给连接。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

试试看?

我不是百分百肯定,但我怀疑你可以一旦调用并且返回了完成连接,或者抛出一个异常就可以了。

在连接周围放置一个try / catch块,当发现异常时,再次调用channel.connect方法可能是安全的。

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