NIO客户端主要创建过程:
 
步骤一:打开SocketChannel,绑定客户端本地地址(可选,默认系统会随机分配一个可用的本地地址),示例代码如下: 
SocketChannel clientChannel = SocketChannel.open(); 

步骤二:设置SocketChannel为非阻塞模式,同时设置客户端连接的TCP参数,示例代码如下:
ClientChannel.configureBlocking(false);
socket.setReuseAddress(true);
socket.setReceiveBufferSize(BUFFER_SIZE);
socket.setSendBufferSize(BUFFER_SIZE);

步骤三:异步连接服务端,示例代码如下:
boolean connected = clientChannel.connect(new InetSocketAddress(IP,port));

步骤四:判断是否连接成功,如果连接成功,则直接注册读状态为到多路复用器中,如果当前没有连接成功(异步连接,返回false,说明客户端已经发送sync包,服务端没有返回ack包,物理链路还没有建立),示例代码如下:
if(connected){clientChannel.register(seletor,SelectionKey.OP_READ,ioHandler);
}else{clientChannel.register(selector,Selection.OP_CONNECT,ioHandler);
}

步骤五:向Reactor线程的多路复用器注册OP_CONNET状态位,监听服务端的TCP ACK应答,示例代码如下:

 clientChannel.register(select, SelectionKey.OP_CONNECT,ioHandler);

步骤六:创建Reactor线程,创建多路复用器并启动线程,示例代码如下:
Selector selector = Selector.open();
New Thread(new ReactorTask()).start();

步骤七:多路复用器在线程run方法的无限循环体内轮询准备就绪的Key,示例代码如下:

int num = selector.select();
Set selectedKeys = selector.selectedKeys();
Iterator it = selectedKeys.iterator();
while(it.hasNext){SelectionKey key = (SelectionKey)it.next();//...deal with  I/O event ...
}

步骤八:接收connect事件进行处理,示例代码如下:
if(key.isConnectable()){//handlerConnect();
}

步骤九:判断连接成功,如果连接成功,注册读事件到多路复用器,示例代码如下:

if(channel.finishConnect()){registerRead();
}

步骤十:注册读事件到多路复用器,示例代码如下:
clientChannel.register(selector,SelectionKey.OP_READ,ioHandler);

步骤十一:异步读客户端请求消息到缓冲区,示例代码如下:

int readNumber = channel.read(receivedBuffer);

步骤十二:对ByteBuffer进行编解码,如果有半包消息接收缓冲区Reset,继续读取后续的报文,将解码成功的消息封装成Task,投递到业务线程池中,进行业务逻辑编排,示例代码如下:

Object message = null;
whiel(buffer.hasRemain()){byteBuffer.mark();Object message = decode(byteBuffer);if(message == null){byteBuffer.reset();break;}messageList.add(message);
}
if( !byteBuffer.hasRemain()){byteBuffer.clear();
}else{byteBuffer.compact();
}
if(messageList != null & !messageList.isEmpty()){for(Object messageE : messageList){handlerTask(messageE);}
}

步骤十三:将POJO对象encode成ByteBuffer,调用SocketChannel的异步write接口,将消息异步发送给客户端。示例代码如下:

socketChannel.write(buffer);

转载于:https://www.cnblogs.com/wmcoder/p/7169550.html

NIO客户端主要创建过程相关推荐

  1. 源码分析netty服务器创建过程vs java nio服务器创建

    1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...

  2. axis idea 设置apache_利用IDEA创建Web Service服务端和客户端的详细过程

    创建服务端 一.file–>new–>project 二.点击next后输入服务端名,点击finish,生成目录如下 三.在 HelloWorld.Java 文件中右击,选 WebServ ...

  3. netty 5 alph1源码分析(服务端创建过程)

    研究了netty的服务端创建过程.至于netty的优势,可以参照网络其他文章.<Netty系列之Netty 服务端创建>是 李林锋撰写的netty源码分析的一篇好文,绝对是技术干货.但抛开 ...

  4. WebCast《实战ASP.NET AJAX系列课程(2):使用客户端框架创建“纯粹”的Ajax应用程序》相关资源...

    本课程将从头开始使用ASP.NET AJAX客户端框架/组件创建一个"纯粹"的Ajax应用程序的全过程.适合于开发者学习Ajax所带来的这种崭新的开发方式,即将表示层完全放在客户端 ...

  5. cov/cor中有遗漏值_协调遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟...

    cov/cor中有遗漏值 在这篇文章中,我演示了许多想法和技术: 如何编写一个简单的非阻塞NIO客户端/服务器 协同遗漏的影响 如何测量百分位数的延迟(相对于简单平均) 如何在计算机上计时延迟回送 我 ...

  6. 协同遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟

    在这篇文章中,我演示了许多想法和技术: 如何编写一个简单的非阻塞NIO客户端/服务器 协调遗漏的影响 如何测量百分位数的延迟(相对于简单平均) 如何在计算机上计时延迟回送 我最近正在为客户端服务器应用 ...

  7. java安卓j建立进程_Android应用进程的创建过程

    基于Android 7.0源码分析 以Launcher点击应用启动应用为例 ActivityManagerService(system_server)请求Zygote创建应用进程的过程 当运行应用时, ...

  8. Builder构建者模式,将复杂对象的创建过程与其表示分离,活学活用才是王道

    首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助. 文章目录 一.前言 传统创建对象的弊端 二.构建者模式 1.通用写法 2.构建者模式的优缺点 3 ...

  9. modbus 客户端获取服务器信息,客户端modbus访问服务器过程

    客户端modbus访问服务器过程 内容精选 换一换 MySQL官网提供了针对不同操作系统的客户端安装包,以5.6为例.单击此处下载MySQL最新版本,单击此处下载其他归档版本.下面将以Red Hat ...

最新文章

  1. NSOprationQueue 与 GCD 的区别与选用
  2. 东南大学成贤学院计算机报名,东南大学成贤学院2017年9月计算机等级考试报名办法...
  3. [css] 举例说明css的基本语句构成是什么呢?
  4. 447. Number of Boomerangs
  5. 《解剖PetShop》系列之一(转)
  6. NumPy基本操作快速熟悉
  7. 基于RxJava2+Retrofit2精心打造的Android基础框架
  8. 物联网火爆,开发者遇到大难题了!
  9. python中文视频教程-中谷python中文视频教程(全38集)
  10. 1、mysql创建用户和授权总结
  11. java中的时间片概念_java中常用的时间处理类TimeUtil
  12. 自己做量化交易软件(28)小白量化实战2--变红买入变绿卖出
  13. 小牛电动Q2营收、利润双增,李一男身价却在6个月内减少8亿美元
  14. JavaSE_面向对象_学习笔记
  15. Word2010无法输入中文
  16. 在php中插入表格,word怎么插入表格
  17. composer更换国内镜像地址
  18. 佑道医生集团获风和资本数千万A轮投资,6个月实现盈亏平衡
  19. 开发中的各种时间格式转换(三)
  20. stm32: 串口空闲中断的实现(HAL库)

热门文章

  1. 【2019牛客暑期多校训练营(第一场) - A】Equivalent Prefixes(单调栈,tricks)
  2. 【HDU - 2398 】Savings Account (水题模拟)
  3. 无限场景开放式仿真器 PGDrive:Improving the Generalization of End-to-End Driving through Procedural Generation
  4. Apollo进阶课程㉖丨Apollo规划技术详解——Understand More on the MP Difficulty
  5. oracle修改某个数据类型,Oracle 修改某个字段的数据类型三种方式
  6. 基于matlab的信号与系统实例,华南理工大学信号与系统实验基于Matlab的信号处理实例...
  7. 微信端php 开发技术要求,微信第三方平台开发详解——PHP版
  8. 全排列变种:限定 排列的差值范围 及 排列中的元素个数
  9. n位数的全排列(需要考虑大数的情况)
  10. Spring Security使用