天天看點

非阻塞通道

非阻塞通道

非阻塞通道用于負責将資料讀到緩沖區中,或将資料從緩沖區中寫入,這個類的作用主要是用于屏蔽非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)