gongxuxuxuxux 2011-06-10 10:15
浏览 186
已采纳

nio问题

         // 打开选择器
            sc = SocketChannel.open(address);
    // 设置非阻塞
    sc.configureBlocking(false);
    // 将SocketChannel对象注册到指定Selector
    sc.register(selector, SelectionKey.OP_CONNECT);

上面的第3行我的理解是。 设置该选择器 sc 对 SocketChannel 的连接事件感兴趣。

但是执行下面的代码 却返回0 (不是连接超时)
selector.select()。

  1. 当我注册通道时。 不添加对连接事件感兴趣select方法返回值就是正确的。 : sc.register(selector, SelectionKey.OP_READ); 我想知道是为何会出现这个状况, 主要是原因。
  • 写回答

5条回答 默认 最新

  • 也许世界还没停 2011-06-20 11:48
    关注

    [quote]1. 为何执行select()却没有进行阻塞呢? ps: 我开始的时候以为是服务器在接收到该客户端的请求时。默认给了响应(和底层实现有关系) 所以我特意在服务器accpct方法设置了断点。 后来发现。即使我没有在服务器端执行accept.客户端的select方法仍然没有阻塞。还是立刻返回0.

    1. 还有一个我觉得奇怪的地方。 我把上面的代码改成 sc.register(selector, SelectionKey.OP_CONNECT|SelectionKey.OP_READ); 效果仍然一样。还是立刻返回0. 但是如果我把上面的代码改成 sc.register(selector,SelectionKey.OP_READ); select 方法却阻塞了。 我想知道这个又是为何? [/quote]

    select方法在有可用channel的时候就返回,不会阻塞

    注意他的返回值并不表示有多少个channel可用

    而表示有多少个channel的可用状态发生改变
    也就是说你的第一个问题返回0,也表示有channel可用
    第二个问题应该立即返回表示有connect可用
    只注册read就阻塞了

    请注意返回值的特点,并不是表明有多少channel可用,一般都忽略这个值

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog