// 打开选择器
sc = SocketChannel.open(address);
// 设置非阻塞
sc.configureBlocking(false);
// 将SocketChannel对象注册到指定Selector
sc.register(selector, SelectionKey.OP_CONNECT);
上面的第3行我的理解是。 设置该选择器 sc 对 SocketChannel 的连接事件感兴趣。
但是执行下面的代码 却返回0 (不是连接超时)
selector.select()。
[quote]1. 为何执行select()却没有进行阻塞呢? ps: 我开始的时候以为是服务器在接收到该客户端的请求时。默认给了响应(和底层实现有关系) 所以我特意在服务器accpct方法设置了断点。 后来发现。即使我没有在服务器端执行accept.客户端的select方法仍然没有阻塞。还是立刻返回0.
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