NIO客户端主要创建过程

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rank 开窗函数_over 开窗函数的的理解

over的功能:一、with Ta as(select 1 as Fa, a as Fbunion allselect 2 as Fa, b as Fbunion allselect 3 as Fa, c as Fbunion allselect 4 as Fa, d as Fbunion allselect 5 as Fa, e as Fb)select FB ,1.*Fa/(select sum(Fa) from Ta)from Tawith Ta as(select 1…

MP3技术白皮书-音频格式全解析

MP3的技术虽然现在已经完全公开,但是,其具体的技术细节还是有一定的深度,因此此次小编对某些技术进行深度解释,希望网友们笑纳。 采样率: 数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的&…

Docker Compose 项目

二、Docker Compose 项目compose项目简介compose项目来源于之前的Fig项目,使用python代码编写。compose项目主要用于编排部署基于docker的应用。本身与docker/swarm配合度很高。Docker Compose 是 Docker 编排服务的一部分,可以让用户在其它平…

Goland安装-工欲善其事必先利其器

⼀、安装Goland开发⼯具 (⼀)、介绍 Goland是由JetBrains公司旨在为go开发者提供的⼀个符合⼈体⼯程学的新 的商业IDE。这个IDE整合了IntelliJ平台的有关go语⾔的编码辅助功能和⼯具集成 特点。它具有以下特点: 编码辅助功能符合⼈体⼯程学…

android 获取sd卡目录失败_树莓派对SD卡的大小,速度有哪些要求?

SD卡容量的大小通过NOOBS安装带有桌面和推荐软件(完整)的 Raspberry Pi OS,SD卡最小为16GB。 对于带有桌面和推荐软件的 Raspberry Pi OS 镜像安装,SD卡最小为8GB。对于安装 Raspberry Pi OS Lite,建议 SD 卡最小为4GB…

OGG音频格式解析

OGG 什么是Ogg Ogg全称是OGG Vobis(ogg Vorbis) ,是一种新的音频压缩格式,类似于MP3等现有的音乐格式。但有一点不同的是,它是完全免费、开放和没有专利限制的。OGG Vobis有一个很出众的特点,就是支持多声道,随…

区分同源与非同源

2019独角兽企业重金招聘Python工程师标准>>> JSONP和AJAX相同,都是客户端向服务器端发送请求:1、给服务器端传递内容2、从服务器端获取数据 的方式 AJAX属于同源策略 JSONP属于非同源策略(跨域请求) -> 实现跨域请求的方式有很多种&#x…

Golang语言写99乘法表-双重for循环

个人博客点这里 1. 标准写法: for 表达式1;表达式2;表达式3{循环体 }2. 同时省略表达式1和表达式3 for 表达式2{循环体 } // 相当于while(条件)3. 同时省略3个表达式 for{循环体 } // 相当于while(true) // 注意:当for循环中,省略了表达式2,就相当于直接作用在了true上4. 其…

移动APP怎样保存用户password

<span style"font-size:14px;">为了更好的用户体验,移动APPclient一般都会将用户信息进行保存以便兴许能够自己主动登录.</span> 保存了用户信息便涉及到了安全问题. 解决办法大概有一下几种: 1.首先,假设client和服务端都是你来设计开发,那么有两种比較…

extjs2.0 文件上传_extjs数据存储与传输

本章内容qExt.data简介qExt.data.ConnectionqExt.data.RecordqExt.data.Storeq常用proxyq常用readerq高级storeqEXT中的Ajaxq关于scope和createDelegate()qDWR与EXT整合10.1Ext.data简介Ext.data在命名空间中定义了一系列store、reader和proxy。Grid和ComboxBox都是以Ext.data为…

盘点key value在各个编程语言中的类型

个人博客点这里 起步 在编程语言中,有这么一种数据类型,我们经常会使用到,他就是类似于json的键值对类型 那么今天我们就对比一下,在各大编程语言中的key value类型的特点 main python key value 叫做字典 dict类型 声明 字典操作 以键值对方式存在的无序数据的组合就是…

音频格式详解 CD WAV MP3 WMA MIDI RM RA OGG VOF AAC M4A APE FLAC TAK TTA MV RealAudio AIFF AU

以下是常见音频文件格式的特点。 要在计算机内播放或是处理音频文件&#xff0c;也就是要对声音文件进行数、模转换&#xff0c;这个过程同样由采样和量化构成&#xff0c;人耳所能听到的声音&#xff0c;最低的频率是从20Hz起一直到最高频率20KHZ&#xff0c;20KHz以上人耳是听…

Spring MVC-表单(Form)标签-下拉框(Dropdown)示例(转载实践)

以下内容翻译自&#xff1a;https://www.tutorialspoint.com/springmvc/springmvc_dropdown.htm 说明&#xff1a;示例基于Spring MVC 4.1.6。 以下示例显示如何使用Spring Web MVC框架在表单中使用Dropdown。首先&#xff0c;让我们使用Eclipse IDE&#xff0c;并按照以下步骤…

vuex的命名空间有哪些_Vuex在vue路由器中访问命名空间模块的getter

我试图通过检查用户是否经过身份验证来保护我的路由&#xff0c;这是示例路由&#xff1a;{path: /intranet,component: search,meta: { requiresAuth: true },props: {tax: type,term: intranet-post,name: Intranet}},我正在这样设置警卫&#xff1a;router.beforeEach((to, …

阿里巴巴中文站架构设计实践(何崚)图书

阿里巴巴中文站架构实践 何崚阿里巴巴 全文地址:阿里巴巴中文站架构设计实践(何崚).pdf 更多课件可到:这里查看 后续内容还在更新…

使用sqlite3创建数据库表的时候须要注意

使用sqlite3创建数据库表的时候须要注意&#xff1a; 1. 不能使用纯数字 2. 不能带有"-",""等字符。也不能以数字打头。一、以下是log打出来的信息&#xff1a; DB Error: 1 "unrecognized token: "47464636265757265763393573649"" D…

物联网世界的承诺与挑战

最初参与到与物联网&#xff08;Internet of Things / IoT&#xff09;相关的行业对话时&#xff0c;我对整个行业的发展充满疑问。“ 物联网”和 “万联网”&#xff08;Internet of Everything&#xff09;有什么区别&#xff1f;这场变革现今是处于启蒙阶段&#xff0c;亦或…

音乐文件基本格式,wave,mod,midi,mp3,wma,flac

经典的WAVE WAVE文件作为最经典的Windows多媒体音频格式&#xff0c;应用非常广泛&#xff0c;它使用三个参数来表示声音&#xff1a;采样位数、采样频率和声道数。 声道有单声道和立体声之分&#xff0c;采样频率一般有11025Hz&#xff08;11kHz&#xff09;、22050Hz&#xf…

bilibili go框架_最好的开发语言一定是那位吗?Go语言有话说

鲁迅先生说过&#xff0c;所有能用 JS 写的前端项目最终都会被用 JS 重写一遍&#xff0c;所有能用 Go 写的后端项目最终也都会被用 Go 重写一遍。作为一名开发者&#xff0c;周六的我们能做什么呢&#xff1f;是因为产品经理的各种需求在加班吗&#xff1f;给你说了实现不了实…