|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册加入
×
一、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
B. 客户端处理器类-NioClientHandle
C. 服务端类-NioServer
D. 服务端处理器类-NioServerHandle
四、实战运行结果
服务端运行结果图:
客户端运行结果图:
到处我们已经完成了手写NIO程序,喜欢小编的来波关注,小编会陆续为你带来更多编程方面的干货内容。
<div class="pgc-img">
|
|