非阻塞通道
非阻塞通道用于负责将数据读到缓冲区中,或将数据从缓冲区中写入,这个类的作用主要是用于屏蔽非SSL与SSL读写操作细节的不同,这个类实现了ByteChannel接口,此接口只有write、read两个操作字节流的方法,细节正是屏蔽在这两个操作中,例如非SSL通信时,报文本来就是明文,可直接读取,而对于SSL通信,报文属于加密后的密文,解密后才是真正需要的报文。同样地,对于非SSL通信直接写入,而对于SSL通信应该把报文加密后再套接字通道。下面看看这两种通道的详细解析。
非SSL通道——NioChannel
非SSL通道即常规不加密直接传输明文的通道,常用的http协议走的就是此通道,它无需加密解密传输。这个组件包含两个重要的部分——SocketChannel和ApplicationBufferHandler,SocketChannel对象是真正与操作系统底层socket交互的对象,包括写入读取操作,而ApplicationBufferHandler接口提供用于操作待写入SocketChannel的缓冲区和读取SocketChannel的缓冲区的协助方法。
SocketChannel属于JDK API对象,用于真正的套接字读写,这里主要分析下ApplicationBufferHandler接口,主要有两个方法getReadBuffer和getWriteBuffer,分别用于获取读缓冲和写缓冲。在分配缓存方式上有两种,一种是分配操作系统本地内存,称为直接内存,它不直接受GC管理,它的操作速度比较快,因为它不需要进行内存拷贝,直接内存只有在它对应的java类DirectByteBuffer类被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的特性,即其中的SocketChannel和ApplicationBufferHandler对象的作用都与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)