很诡异的nio非阻塞通信

我先把代码贴出来吧


public class AServer {
public static void main(String[] args) throws Exception {
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
server.socket().bind(new InetSocketAddress(8080));
Selector selector = Selector.open();
server.register(selector, SelectionKey.OP_ACCEPT);

while (true) {
selector.select();
System.out.println("selector.select()---------" + selector.select());
//readKeys集合
Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
iter.remove();

if (key.isAcceptable()) {
System.out.println("acceptable");
// ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
SocketChannel client = server.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) {
System.out.println("this server is readable");
}
}
}
}
}


-------------------------------------------------------------------------------------------------------

public class AClient {
public static void main(String[] args) throws Exception {
SocketChannel client = SocketChannel.open();
client.configureBlocking(false);
Selector selector = Selector.open();
client.register(selector, SelectionKey.OP_CONNECT);
client.connect(new InetSocketAddress("localhost", 8080));

while (true) {
selector.select();
//readKeys
Iterator<SelectionKey> iter = selector.selectedKeys().iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
iter.remove();

if (key.isConnectable()) {
// System.out.println("connnect");
SocketChannel socket = (SocketChannel) key.channel();
socket.configureBlocking(false);
// socket.register(selector, SelectionKey.OP_READ);
// System.out.println("client is connected");
} else if (key.isReadable()) {
System.out.println("client is read");
}
}
}
}
}


-------------------------------------------------------------------------------------------------------
我注释掉AServer中的System.out.println("acceptable")和AClient中的System.out.println("connnect"),在AServer中就不能打印System.out.println("this server is readable")这句了。

还有两个问题就是我没有注掉System.out.println("acceptable")和System.out.println("connnect")时,AServer中一直会执行System.out.println("this server is readable");AClient也会一直执行System.out.println("connnect"),我感到疑惑的是执行了
SelectionKey key = iter.next();
iter.remove();
这个之后,key不是被删除了么,不应该出现很多次
if (key.isConnectable()) {
// System.out.println("connnect");
SocketChannel socket = (SocketChannel) key.channel();
socket.configureBlocking(false);
// socket.register(selector, SelectionKey.OP_READ);
// System.out.println("client is connected");
}
这里面打印的内容呀

还有个疑惑就是在AServer中
SocketChannel client = server.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
执行了这段代码,client注册SelectionKey.OP_READ为可读的操作,是服务器端和客户端的key都是Readable可读的?如果是可读的为什么在AClient中没有打印
System.out.println("client is read");
这句呀。

由于才接触到nio这块,不是很熟悉,大家可以帮我看看么,感谢ing
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值