java之nio(1)

来源:互联网 发布:网络销售酒 编辑:程序博客网 时间:2024/06/15 10:04

nio服务端时序流程

这里写图片描述
大概步骤如下:
1.打开ServerSocketChannel,用于监听客户端的链接,它是所有客户端连接的父管道;
2.绑定监听端口,设置为非阻塞模式;
3.创建Reactor线程,创建多路复用器并启动线程;
4.将ServerSocketChannel注册到Reactor线程的多路复用器Selector上,监听ACCEPT事件;
5.多路复用器在线程run方法的无限循环体内轮询准备就绪的Key;
6.多路复用器监听到有新的客户端接入,处理新的接入请求,完成TCP三次握手,建立物理链路;
7.设置客户端链路为非阻塞模式;
8.将新接入的客户端连接注册到Reactor线程的多路复用器上,继续监听读操作,读取客户端发送的网络请求;
9.异步读取客户端请求消息到缓冲区;
10.对ByteBuffer进行编码,如果有半包消息指针reset,继续读取后续的报文,将编码成功的消息封装成Task,投递到业务线程池中,进行业务逻辑编排;
11.讲POJO对象encode成ByteBuffer,调用SocketChannel的异步write接口,将消息异步发送给客户端。

nio客户端时序图

这里写图片描述
1.打开Socketchannel,绑定客户端本地地址(可选,默认系统会随机分配一个可用的本地地址);
2.设置SocketChannel为非阻塞模式,同时设置客户端连接的TCP参数;
3.异步连接服务端;
4.判断连接是否成功,如果连接成功,则直接注册读状态位到多路复用器中,如没当前没有连接成功(异步连接,返回false,说明客户端已经发送sync包,服务端没有返回ack包,物理链路还没有建立);
5.向Reactor线程的多路复用器注册OP_CONNECT状态位,监听TCP ACK应答;
6.创建Reactor线程,创建多路复用器并启动线程;
7.多路复用器在线程run方法的无限循环体内轮询准备就绪的Key;
8.接收connect事件进行处理;
9.判断连接结果,如果连接成功,注册读事件到多路复用器;
10.注册读事件到多路复用器;
11.异步读取客户端请求到缓冲区;
12.对Bytebuff进行编解码,如果有半包消息接收缓冲区Reset,继续读取后续的报文,将编码成功的消息封装成Task,投递到业务线程池中,进行业务逻辑编排;
13.将POJO对象encode成ByteBuffer,调用SockeChannel的异步write接口,将消息异步发送给客户端;

原创粉丝点击