非阻塞通道

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 非阻塞通道非阻塞通道用于负责将数据读到缓冲区中,或将数据从缓冲区中写入,这个类的作用主要是用于屏蔽非SSL与SSL读写操作细节的不同,这个类实现了ByteChannel接口,此接口只有write、read两个操作字节流的方法,细节正是屏蔽在这两个操作中,例如非SSL通信时,报文本来就是明文,可直接读取,而对于SSL通信,报文属于加密后的密文,解密后才是真正需要的报文。
非阻塞通道

非阻塞通道用于负责将数据读到缓冲区中,或将数据从缓冲区中写入,这个类的作用主要是用于屏蔽非SSLSSL读写操作细节的不同,这个类实现了ByteChannel接口,此接口只有writeread两个操作字节流的方法,细节正是屏蔽在这两个操作中,例如非SSL通信时,报文本来就是明文,可直接读取,而对于SSL通信,报文属于加密后的密文,解密后才是真正需要的报文。同样地,对于非SSL通信直接写入,而对于SSL通信应该把报文加密后再套接字通道。下面看看这两种通道的详细解析。

SSL通道——NioChannel

SSL通道即常规不加密直接传输明文的通道,常用的http协议走的就是此通道,它无需加密解密传输。这个组件包含两个重要的部分——SocketChannelApplicationBufferHandlerSocketChannel对象是真正与操作系统底层socket交互的对象,包括写入读取操作,而ApplicationBufferHandler接口提供用于操作待写入SocketChannel的缓冲区和读取SocketChannel的缓冲区的协助方法。

 

SocketChannel属于JDK API对象,用于真正的套接字读写,这里主要分析下ApplicationBufferHandler接口,主要有两个方法getReadBuffergetWriteBuffer,分别用于获取读缓冲和写缓冲。在分配缓存方式上有两种,一种是分配操作系统本地内存,称为直接内存,它不直接受GC管理,它的操作速度比较快,因为它不需要进行内存拷贝,直接内存只有在它对应的javaDirectByteBuffer类被gc时才会调用释放内存方法,或者程序手动调用对应的方法释放直接内存,否则直接内存不会被释放,可能会导致内存泄漏;一种是分配JVM堆内存,它由GC管理,它的操作速度相对较慢,因为它在本地内存与JVM内存中相互拷贝。

    public static class NioBufferHandler implements ApplicationBufferHandler {

        protected ByteBuffer readbuf = null;

        protected ByteBuffer writebuf = null;

        public NioBufferHandler(int readsize, int writesize, boolean direct) {

            if ( direct ) {

                readbuf = ByteBuffer.allocateDirect(readsize);

                writebuf = ByteBuffer.allocateDirect(writesize);

            }else {

                readbuf = ByteBuffer.allocate(readsize);

                writebuf = ByteBuffer.allocate(writesize);

            }

        }

        public ByteBuffer getReadBuffer() {return readbuf;}

        public ByteBuffer getWriteBuffer() {return writebuf;}

}

SSL通道的作用就是,通过它读取来自操作系统底层的socket数据到直接内存或jvm堆内存,或将直接内存或jvm堆内存写入到底层socket

 

SSL加密通道——SecureNioChannel

对于一些涉及到安全数据的传递需要使用SSL加密通道,常见的https协议走的就是此通道,SSL加密通道的实现需要依赖JSSE,而JSSE主要的责任是将数据进行加密打包或拆包解密,此组件继承了非SSL通道NioChannel的特性,即其中的SocketChannelApplicationBufferHandler对象的作用都与NioChannel相同,另外还额外包含一些对象,两个ByteBuffer对象分别用于存放网络接收到的为经过解密的字节流和经过加密后带发送的字节流,而SSLEngine引擎则负责加密解密工作,HandshakeStatus则是SSL协议握手阶段的状态。

SecureNioChannel其实就是在NioChannel上加了一层,使之拥有SSL协议通信的能力,而具体的实现则基于JSSE,相关细节可返回“NIO模式实现SSL通信”章节阅读。

 







========广告时间========鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。[为什么写《Tomcat内核设计剖析》](http://blog.csdn.net/wangyangzhizhou/article/details/74080321)=========================欢迎关注:![这里写图片描述](http://img.blog.csdn.net/20170509102539658?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3lhbmd6aGl6aG91/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

========广告时间======== 鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。 [为什么写《Tomcat内核设计剖析》](http://blog.csdn.net/wangyangzhizhou/article/details/74080321) ========================= 欢迎关注: ![这里写图片描述](http://img.blog.csdn.net/20170509102539658?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3lhbmd6aGl6aG91/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
目录
相关文章
|
6月前
|
负载均衡 NoSQL 网络协议
网络中的阻塞与非阻塞以及reactor模型
网络中的阻塞与非阻塞以及reactor模型
42 0
套接字非阻塞设置
套接字非阻塞设置
|
4月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
182 1
|
4月前
|
存储 Go
GO通道:无缓冲通道与缓冲通道
GO通道:无缓冲通道与缓冲通道
38 0
|
5月前
|
安全 Go 调度
协程(goroutine)和通道(channel)是其并发模型
协程(goroutine)和通道(channel)是其并发模型
28 0
非阻塞
非阻塞
54 0
Daz
|
Linux 程序员 API
|
缓存 监控 Kubernetes
聊聊同步、异步、阻塞、非阻塞以及IO模型
同步、异步、阻塞、非阻塞以及IO模型
网络基础 - 同步、异步、阻塞、非阻塞
网络基础 - 同步、异步、阻塞、非阻塞
196 0
|
缓存
多线程之间的通信~~~管道通道
多线程之间的通信~~~管道通道
222 0