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 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试