NIO客户端主要创建过程
SocketChannel clientChannel = SocketChannel.open();
ClientChannel.configureBlocking(false);
socket.setReuseAddress(true);
socket.setReceiveBufferSize(BUFFER_SIZE);
socket.setSendBufferSize(BUFFER_SIZE);
boolean connected = clientChannel.connect(new InetSocketAddress(IP,port));
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);
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 ...
}
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客户端主要创建过程相关推荐
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- axis idea 设置apache_利用IDEA创建Web Service服务端和客户端的详细过程
创建服务端 一.file–>new–>project 二.点击next后输入服务端名,点击finish,生成目录如下 三.在 HelloWorld.Java 文件中右击,选 WebServ ...
- netty 5 alph1源码分析(服务端创建过程)
研究了netty的服务端创建过程.至于netty的优势,可以参照网络其他文章.<Netty系列之Netty 服务端创建>是 李林锋撰写的netty源码分析的一篇好文,绝对是技术干货.但抛开 ...
- WebCast《实战ASP.NET AJAX系列课程(2):使用客户端框架创建“纯粹”的Ajax应用程序》相关资源...
本课程将从头开始使用ASP.NET AJAX客户端框架/组件创建一个"纯粹"的Ajax应用程序的全过程.适合于开发者学习Ajax所带来的这种崭新的开发方式,即将表示层完全放在客户端 ...
- cov/cor中有遗漏值_协调遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟...
cov/cor中有遗漏值 在这篇文章中,我演示了许多想法和技术: 如何编写一个简单的非阻塞NIO客户端/服务器 协同遗漏的影响 如何测量百分位数的延迟(相对于简单平均) 如何在计算机上计时延迟回送 我 ...
- 协同遗漏的效果–使用简单的NIO客户端/服务器测量回送延迟
在这篇文章中,我演示了许多想法和技术: 如何编写一个简单的非阻塞NIO客户端/服务器 协调遗漏的影响 如何测量百分位数的延迟(相对于简单平均) 如何在计算机上计时延迟回送 我最近正在为客户端服务器应用 ...
- java安卓j建立进程_Android应用进程的创建过程
基于Android 7.0源码分析 以Launcher点击应用启动应用为例 ActivityManagerService(system_server)请求Zygote创建应用进程的过程 当运行应用时, ...
- Builder构建者模式,将复杂对象的创建过程与其表示分离,活学活用才是王道
首发CSDN:徐同学呀,原创不易,转载请注明源链接.我是徐同学,用心输出高质量文章,希望对你有所帮助. 文章目录 一.前言 传统创建对象的弊端 二.构建者模式 1.通用写法 2.构建者模式的优缺点 3 ...
- modbus 客户端获取服务器信息,客户端modbus访问服务器过程
客户端modbus访问服务器过程 内容精选 换一换 MySQL官网提供了针对不同操作系统的客户端安装包,以5.6为例.单击此处下载MySQL最新版本,单击此处下载其他归档版本.下面将以Red Hat ...
最新文章
- NSOprationQueue 与 GCD 的区别与选用
- 东南大学成贤学院计算机报名,东南大学成贤学院2017年9月计算机等级考试报名办法...
- [css] 举例说明css的基本语句构成是什么呢?
- 447. Number of Boomerangs
- 《解剖PetShop》系列之一(转)
- NumPy基本操作快速熟悉
- 基于RxJava2+Retrofit2精心打造的Android基础框架
- 物联网火爆,开发者遇到大难题了!
- python中文视频教程-中谷python中文视频教程(全38集)
- 1、mysql创建用户和授权总结
- java中的时间片概念_java中常用的时间处理类TimeUtil
- 自己做量化交易软件(28)小白量化实战2--变红买入变绿卖出
- 小牛电动Q2营收、利润双增,李一男身价却在6个月内减少8亿美元
- JavaSE_面向对象_学习笔记
- Word2010无法输入中文
- 在php中插入表格,word怎么插入表格
- composer更换国内镜像地址
- 佑道医生集团获风和资本数千万A轮投资,6个月实现盈亏平衡
- 开发中的各种时间格式转换(三)
- stm32: 串口空闲中断的实现(HAL库)
热门文章
- 【2019牛客暑期多校训练营(第一场) - A】Equivalent Prefixes(单调栈,tricks)
- 【HDU - 2398 】Savings Account (水题模拟)
- 无限场景开放式仿真器 PGDrive:Improving the Generalization of End-to-End Driving through Procedural Generation
- Apollo进阶课程㉖丨Apollo规划技术详解——Understand More on the MP Difficulty
- oracle修改某个数据类型,Oracle 修改某个字段的数据类型三种方式
- 基于matlab的信号与系统实例,华南理工大学信号与系统实验基于Matlab的信号处理实例...
- 微信端php 开发技术要求,微信第三方平台开发详解——PHP版
- 全排列变种:限定 排列的差值范围 及 排列中的元素个数
- n位数的全排列(需要考虑大数的情况)
- Spring Security使用