AIO的这个例子里 `else if ("write".equals(type)){}` 的代码是在什么时候被用到的?

来源:8-8 演示

皮卡乒乓

2020-07-26

我的理解是,AcceptHandlercompleted函数里有写 info.put("type", "read");,那么就对应到 ClientHandlercompleted函数if ("read".equals(type)){ }分支,那么请问一下 else if ("write".equals(type)){}这个分支的代码是不是在本例子没有被执行到?又或者是我理解错了,它具体在什么地方被执行的?

写回答

1回答

Stannum

2020-08-08

同学你好~在https://git.imooc.com/coding-381/aio-tutorial/src/master/Server.java#L94这里,我们调用了clientChannel.write(...)函数来把消息发送给客户,这个write函数是异步的,当这个异步write操作完成了之后,就会调用ClientHandler里面的completed函数:https://git.imooc.com/coding-381/aio-tutorial/src/master/Server.java#L94,在这个时候,我们就会发现刚刚完成的这个异步操作的type是"write",于是我们就知道接下来应该去调用clientChannel.read(...)函数来继续听取客户发送来的消息了。

也就是说,是ClientHandler自己不断地在调用clientChannel的read和write操作,这两个操作是交替被调用的,read完成了就调用write,write完成了就调用read,这样服务器才能不停地和客户通信


0
0

系统学习Java网络编程 深度理解BIO/NIO/AIO

对比式学习助你真正理解BIO/NIO/AIO三大网络编程模型。

880 学习 · 148 问题

查看课程