NIO服务器客户端交互事件状态变化

Java NIO 由以下几个核心部分组成:
1、Buffer2、Channel3、Selector
socket编程时,accept方法会一直阻塞,直到有客户端请求的到来,并返回socket进行相应的处理。整个过程是流水线的,处理完一个请求,才能去获取并处理后面的请求,当然也可以把获取socket和处理socket的过程分开,一个线程负责accept,一个线程池负责处理请求。
但NIO提供了更好的解决方案,采用选择器(Selector)返回已经准备好的socket,并按顺序处理,基于通道(Channel)和缓冲区(Buffer)来进行数据的传输。
服务端和客户端各自维护一个管理通道的对象,我们称之为selector,该对象能检测一个或多个通道 (channel) 上的事件。我们以服务端为例,如果服务端的selector上注册了读事件,某时刻客户端给服务端发送了一些数据,阻塞I/O这时会调用read()方法阻塞地读取数据,而NIO的服务端会在selector中添加一个读事件。服务端的处理线程会轮询地访问selector,如果访问selector时发现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处理线程会一直阻塞直到感兴趣的事件到达为止。下面是我理解的java NIO的通信模型示意图:
在这里插入图片描述
channel可注册的事件

在这里插入图片描述 分析:如服务端想要接收客户端的信息 注册事件变化如下
1.首先服务端默认状态为OP_ACEEPT,客户端链接建立时会注册状态事件为OP_CONNECT,成功连接时,会触发服务端的OP_ACEEPT的对应逻辑处理。
2.在服务端的OP_ACEEPT的对应逻辑处理中服务端会将自己感兴趣的事件注册为OP_READ来监听客户端的发送。而客户端会在自己的OP_CONNECT逻辑处理中进行写入操作向服务端发送数据。
3.服务端监听到客户端发送到的数据,在OP_READ的逻辑方法中获取到数据,为了向客户端发送数据,将自己的事件注册为OP_WRITE。而客户端为了接收服务端的数据,应在步骤2发送完数据后将自己的事件更改为OP_READ
4.客户端在自己的OP_READ逻辑中获取服务端数据,至此一次完整的数据交互就完成了。

服务端

package zmx.nio.test;
 
import ja
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值