nio思想和netty架构学习

1、传统的IO 进行读写数据
使用传统的I/O程序读取文件内容,并写入到另外一个文件(或Socket),如下程序:
file.read(fileDesc, buf, len);
Socket.send(socket,buf,len)
会有很大的内存开销。主要分为一下两方面
1)、上下文切换(context switch),此处有4次用户态和内核态的切换。
2)、buffer内存开销方面,一个是应用程序的buffer,另外一个是系统读取buffer以及socket buffer。其运行示意图为:
在这里插入图片描述
1)、先将文件内容从磁盘拷贝到操作系统buffer
2)、再从操作系统buffer拷贝到程序应用buffer
3)、从程序buffer拷贝到socket buffer
4)、从socket buffer 拷贝到协议引擎。

2、nio的实现
NIO技术省去了将操作系统的read buffer拷贝到程序的buffer, 以及从程序buffer拷贝到socket buffer的步骤, 直接将 read buffer 拷贝到 socket buffer. java 的 FileChannel.transferTo() 方法就是这样的实现, 这个实现是依赖于操作系统底层的sendFile()实现的.

具体流程图为:
在这里插入图片描述
综述两图可以发现: 其增加了一个方法transferTo()调用java 底层具体的方法为:
publicvoid transferTo(long position, long count, WritableByteChannel target);
他的底层调用的是系统调用sendFile()方法
sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

3、netty 架构学习
netty 是基于java nio的网络应用架构
netty是一个nio client-server(客户端服务器)框架。使用netty可以快速开发网络应用,例如服务器和客户端协议。Netty提供了一种新的方式来使开发网络应用程序,这种新的方式使得它很容易使用和有很强的扩展性。netty的内部实现时很复杂,但是netty 提供了简单易用的api。从网络处理代码种解锁业务逻辑。netty是完全基于NIO实现的,所以整个netty都是异步的。

简单的demo实现:
一般netty的编写分为client端和server端两种。
在这里插入图片描述
在这里插入图片描述

server端的具体实现为
在这里插入图片描述
在这里插入图片描述
具体步骤为为。除了对客户端连接服务端做一些配置(如指定多线程处理、指定通道类型、配置服务端地址等信息之外,还指定了client 得操作类EchoClientHandler。

在这里插入图片描述
而从其EchoClientHandler操作类中我们发现主要通过继承SimpleChannelInboundHandler的类,并实现其种三个方法完成异步处理流程。
三个实现方法分别为:
(1)、客户端连接服务器后被调用
(2)、从服务器接收数据后被调用
(3)、发生异常时被调用

在server端的调用端逻辑和上面相似,也是通过配置(连接池、通道类型、地址等),然后指定自己的操作类去具体实现自己想要的逻辑(EchoServerHandler)。
在这里插入图片描述
在EchoServerHandler 中通过继承ChannelInboundHandlerAdapter类重新实现了他们的三个方法来完成我们想要的操作。三个具体方法为
(1)、server端读取数据之后要做的操作
(2)、读取数据完毕之后要做的操作
(3)、出现异常之后要做的操作

综述所述:通过client端发送数据,和接收数据 触发事件。server端也是通过接收数据和接收完数据的操作 实现异步操作的具体逻辑。

猜你喜欢

转载自blog.csdn.net/weixin_40809627/article/details/105631439