QQ登录

只需一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 861|回复: 0
收起左侧

互联网公司面试必问的NIO你会了吗,手把手教你手写NIO程序 ...

[复制链接]
发表于 2018-10-14 16:04:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册加入

×
一、NIO中比较重要的几个概念
1.channel—通道,是应用程序和操作系统交互事件、传递内容的渠道,channel可看成对IO的一个抽象.注意我们读写数据的时候是无法直接读写到channel的,channel只接受缓存也就是所谓的buffer对象,Channel允许注册的操作类型由SelectionKey来指定
2.Buffer ,buffer本质上是一块可以读写的内存,这个块内存被JDK包装成NIO中的buffer对象,我们要通过channel发送数据必须先读写到缓冲区中,在读写到channel
3.selector—选择器或者是事件订阅器,应用程序要向selector注册它所关心的channel与及channel对那些IO感兴趣
4.SelectionKey—操作类型 ,JDK 中定义了四种网络socket操作类型OP_READ(读)、OP_WRITE(写)、OP_CONNECT(请求连接)、OP_ACCEPT(接受连接)
二、如何开始编程及分析?
NIO 我们使用4个类来编写我们的NIO程序
1.客户端类(NioClient)
2.客户端处理器类(NioClientHandle)
3.服务端类(NioServer)
4.服务端处理器类(NioServerHandle)
#################################
A.客户端类-NioClient分析
1.创建启动方法start()方法
2.创建一个sendMsg方法,用于向服务端发送信息
3.主线程main方法中,调用start(),启动后调用sendMsg()方法,并且监督我们的键盘输入,将我们输入的信息发送到服务端
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
start()方法里面做的事情如下:
a.创建一个NioClientHandle对象,NioClientHandle实现了runnable接口
b.创建一个线程来运行我们的程序,new Theard
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sendMsg方法里面做的事情如下:
a.调用NioClientHandle对象的sendMsg
#################################
B.客户端处理器类-NioClientHandle分析
1.NioClientHandle(String host,int port)构造方法,该方法会创建选择器selector与通道socketChannel,TCP Socket套接字的监听通道
2.doConnect()方法,用于连接服务端
3.sendMsg()方法,用于向服务器发送信息
4.stop()方法,用于终于我们的程序,不在接收服务端信息
5.handleInput()方法,我们封装对应的事情处理方法,是一个事件处理的总方法
6.run()方法,因为我实现了runnable接口
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
doConnect()方法里面做的事情如下:
a.向selector注册我们所关心的连接事件(OP_CONNECT)
b.SelectionKey—操作类型使用OP_CONNECT
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
run()方法里面做的事情如下:
a.调用doConnect()建立连接或者注册连接事件,注意连接成功会默认帮我们关注OP_READ读事件
b.循环遍历选择器selector
c.获取selector中有那些我们所关心的SelectionKey操作,也就是SelectionKey集合
d.循环遍历SelectionKey集合
e.将对应的操作类型,交给对应的事情处理方法处理,我们创建一个handleInput()方法来封装这些处理方法,同时将这个事件移出该集合
f.selector关闭后会自动释放里面管理的资源
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
handleInput()方法里面做的事情如下:
a.连接事件处理,判断是否已经连接,如未连接,我们则退出程序,毕竟我们是客户端,如果连接不上服务端,其他事件也就不需要继续处理
b.读事件处理,这里需要注意连接成功会默认帮我们关注OP_READ读事件,我们可以对读事件进行相关的业务处理,记住要读写数据时必须使用buffer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sendMsg()方法里面做的事情如下:
a.创建buffer
b.将你要发送到服务端的信息写入buffer,也就是缓存区
c.将buffer写到channel中,发送缓冲区的数据到服务端
#################################
C.服务端类-NioServer分析
1.创建启动方法start()方法
2.主线程main方法中,调用start()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
start()方法里面做的事情如下:
a.创建一个NioServerHandle对象,NioServerHandle实现了runnable接口
b.创建一个线程来运行我们的程序,new Theard
#################################
D.服务端处理器类-NioServerHandle分析
1.NioServerHandle(int port)构造方法,该方法会创建选择器selector与通道ServerSocketChannel,TCP Socket套接字的监听通道
2.stop()方法,用于终于我们的程序
3.handleInput()方法,我们封装对应的事情处理方法,是一个事件处理的总方法
4.doWrite()方法,用于向客户端发送信息
5.run()方法,因为我实现了runnable接口
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
run()方法里面做的事情如下:
a.循环遍历选择器selector
b.获取selector中有那些我们所关心的SelectionKey操作,也就是SelectionKey集合
c.循环遍历SelectionKey集合
d.将对应的操作类型,交给对应的事情处理方法处理,我们创建一个handleInput()方法来封装这些处理方法,同时将这个事件移出该集合
e.selector关闭后会自动释放里面管理的资源
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
handleInput()方法里面做的事情如下:
a.接收连接事件处理,判断是否已经建立连接,如果已经连接则开始关注OP_READ读事件
b.读事件处理,这里需要注意连接成功会默认帮我们关注OP_READ读事件,我们可以对读事件进行相关的业务处理,记住要读写数据时必须使用buffer
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
doWrite()方法里面做的事情如下:
1.创建一个buffer,我们使用的是ByteBuffer
2.向buffer里面写入要发送去客户端的信息
3.调用channel发送缓冲区的字节数组
三、编程实战代码
A. 客户端类-NioClient
V9X9Vdr97xL0l77e.jpg

B. 客户端处理器类-NioClientHandle
BSSEIYzaJA6FOf96.jpg

C. 服务端类-NioServer
z1E1W5665616X4fA.jpg

D. 服务端处理器类-NioServerHandle
Mo44XVvrKvhV7h2V.jpg

四、实战运行结果
服务端运行结果图:
rQ0qSNSL3kbKvak1.jpg

客户端运行结果图:
hu9oG9wEPhOu3e9P.jpg

到处我们已经完成了手写NIO程序,喜欢小编的来波关注,小编会陆续为你带来更多编程方面的干货内容。
<div class="pgc-img"> JEy8GpKslPWQ2CdW.jpg
欢迎来到【天府同城大成都】-天府四川的吃喝玩乐—生活消费媒体网站!请记住我们的域名www.fqtc.com
您需要登录后才可以回帖 登录 | 注册加入

本版积分规则

×本站发帖友情提示
1、注册用户在本站发表/转载的任何作品仅代表其个人观点,不代表本站立场。
2、如果存在违反国家相关法律、法规、条例的行为,我们有权在不经作者准许的情况下删除其在本站所发表的文章。
3、所有网友不要盗用有明确版权要求的作品,转贴请注明来源,否则文责自负。如有侵犯您的权益请联系我们及时删除。
4、本站保护注册用户个人资料,但是在自身原因导致个人资料泄露、丢失、被盗或篡改,本站概不负责,也不承担相应法律责任。

关闭

站长推荐上一条 /1 下一条

客服热线
400-1234-888 周一至周日:09:00 - 21:00
公司地址:北京市朝阳区科技路88号现代城5号楼

天府生活网(www.fqtc.com)四川生活网为你提供房产、招聘、黄页、团购、交友、二手、宠物、车辆、周边游、本地生活、供求信息等海量分类信息,是专业,免费,高效的本地生活信息服务平台。

Powered by Discuz! X3.5 © 2001-2013 Comsenz Inc.

QQ|广告报价|小黑屋|Archiver|手机版|免责声明|大成都 ( 蜀ICP备19006310号-4 )

GMT+8, 2024-11-27 08:40 , Processed in 0.121348 second(s), 22 queries .

快速回复 返回顶部 返回列表