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); 我想知道是为何会出现这个状况, 主要是原因。

[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可用,一般都忽略这个值

[code="java"] selector.select()。 [/code]
这个方法是返回事件发生的数量,0的话就是说明没发生。也就是说没有别的client连接过来,所以connect事件没发生。

[quote]你前面说 :没有别的client连接过来

你刚刚可能看错了。 这个是客户端。 不是服务端。

你能告诉我。 sc.register(selector, SelectionKey.OP_CONNECT) 这个代码的使用场景吗?
因为我发现

//服务端代码。。。
if (sk.isConnectable()) {

                        ((SocketChannel)sk.channel()).finishConnect();

                        sk.interestOps(SelectionKey.OP_READ);

                   }

这个没有执行过。 谢谢啦[/quote]
把代码上全看看 :D

[quote]把代码上全看看[/quote]
刚刚看到你的代码。我觉得你写的有点问题,你现在应该是能收到客户端发送的信息,但是客户端收不到服务器发送的信息,对吧?至于你说的sk.isConnectable()应该是跟accept并发响应的。accept的话说明应该已经连接了。我再看看。 :D

[quote]你指的是我发给你的代码吗? 都可以的。客户端可以收到服务器发送的响应(当然服务器的响应内容 基本就是客户端发送的 。呵呵 支持多个客户端群发。群连)[/quote]
我看了一下貌似不可以接受,还有,你想问的问题是什么?呵呵 :o