【问题标题】:Can blocking SocketChannel connect return false?阻塞 SocketChannel 连接可以返回 false 吗?
【发布时间】:2013-11-19 06:45:07
【问题描述】:

当我阅读 SocketChannel 的文档时,似乎很清楚阻塞 SocketChannel connect() 调用只会返回 true 或抛出异常。换句话说,它只能在非阻塞模式下返回 false。这是正确的,还是我错过/误读了什么?

channel.configureBlocking(true) 是否有可能返回并且通道不处于阻塞模式?我希望如果 configureBlocking(true) 无法成功地将通道置于阻塞模式(在方法调用返回之前),则会引发异常。对吗?

最后,有没有什么方法可以让下面的代码连接失败却返回 TRUE? (代码只测试连接是否成功,对通道不做任何事情,因此立即关闭):

SocketChannel channel = null;
try {
    channel = SocketChannel.open();
    channel.configureBlocking(true);
    channel.connect(new InetSocketAddress(addr, port));
    return Boolean.TRUE;
}
catch (Exception e) {
    return Boolean.FALSE;
}
finally {
    if (channel != null) {
        try { channel.close() } catch (Exception e) {}
    }
}

谢谢!

【问题讨论】:

  • 您在问题中的所有假设都是正确的。该代码将连接或返回FALSE。不过,你的问题是什么?
  • @kiruwka 他不是这么说的,也不正确。它将要么连接并返回 TRUE,要么抛出异常。他的问题说得很清楚。

标签: java nio socketchannel


【解决方案1】:
  1. Javadoc 明确指出“如果此通道处于阻塞模式,则此方法的调用将阻塞,直到建立连接或发生 I/O 错误”。所以它要么返回true,要么抛出异常。

  2. 'channel.configureBlocking(true) 是否可以返回并且通道不处于阻塞模式?不,如果它不能执行操作,它会抛出一个异常。这在 Javadoc 中也有明确说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2011-10-09
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多