- NIO與Socket編程技術指南
- 高洪巖
- 2850字
- 2019-01-05 05:42:02
Chapter 1 第1章 緩沖區的使用
學習NIO能更加接近架構級的技術體系,對未來的職業發展有非常好的促進作用。
當你看到以上這段文字的時候,筆者要恭喜你,因為你正在往Java高性能、高并發、高吞吐量技術的道路上邁進,也就代表著未來是有可能將自己的職業規劃定位在Java高級程序員、Java資深工程師,以及技術經理、技術總監或首席技術官(CTO)這類職位上。這些職位對Java技術的掌握是有一定要求和標準的,至少筆者認為要將自己對技術的關注點從SSH、SSM分離出去,落腳在多線程、并發處理、NIO及Socket技術上,因為這些技術是開發Java高性能服務器必須要掌握的,甚至有些第三方的優秀框架也在使用這些技術。先不說自己開發框架,即使想要讀懂第三方框架的源代碼,也要掌握上面提到的多線程、并發處理、NIO及Socket這4種核心技術。當你正在進行SSH、SSM這類Web開發工作時,想要往更高的層次發展,筆者的其他兩本書《Java多線程編程核心技術》和《Java并發編程:核心方法與框架》,以及本書一定會帶給你非常大的幫助,因為這些內容是Java SE技術中的核心,是衡量一個Java程序員是否合格的明顯標志。
在正式開始介紹NIO之前,先簡要介紹一下Java SE中的4大核心技術:多線程、并發處理、Socket和NIO。如果你是這些技術的初學者,那么這將幫助你了解這些技術及其用途,以及它們的應用場景。
(1)多線程
可以這樣說,高性能的解決方案一定離不開多線程,它可以使1個CPU幾乎在同一時間運行更多的任務。在指定的時間單位內運行更多的任務,其實就是大幅度提高運行效率,讓軟件運行更流暢,處理的數據更多,以提升使用軟件時的用戶體驗。在Java中,使用Thread類來實現多線程功能的處理。在學習多線程時,要注意同步與異步的區別,也就是著重觀察synchronized關鍵字在不同代碼結構中的使用效果。另外,多線程的隨機性,以及多線程運行亂序的可控制性,這些都是在學習該技術時要著重掌握的。在學習Socket之前,建議先掌握多線程技術,因為使用Socket實現某些功能時是需要借助于多線程的。另外在面試時,多線程方面的知識點是被問及比較多的,可見該技術的重要程度。
推薦筆者的拙作《Java多線程編程核心技術》,封面如圖1-1所示。

圖1-1 Java多線程編程核心技術
(2)并發處理
你可以愉快地使用Thread類來學習編寫多線程的應用程序,但在真實的軟件項目開發中實現一些較復雜的邏輯時,其實并不是那么容易,因為多線程的隨機性、不方便控制性和調試麻煩等特性也許會給開發過程帶來麻煩,但好在Doug Lea開發的java.util.concurrent并發包提供了絕大多數常用的功能。concurrent并發包是對多線程技術的封裝,使用并發包中的類可以大幅度降低多線程代碼的復雜度。使用封裝好的API就可以實現以前使用幾十行甚至上百行才能實現的功能。使用并發包可以限制訪問的流量、線程間的數據交流,在同步處理時使用更加方便和高效率的鎖(Lock)對象、讀寫鎖對象,以及可以提高運行效率的線程池,支持異步及回調接口,支持計劃任務,支持fork-join分治編程,而且還提供了并發集合框架。上述功能都是Doug Lea的貢獻。只有真正地接觸到concurrent并發包,才能深刻地體會使用Thread類編程的原始性,會讓你的解題思路更加廣闊。
推薦筆者的拙作《Java并發編程:核心方法與框架》,封面如圖1-2所示。

圖1-2 Java并發編程:核心方法與框架
(3)Socket
高性能服務器的架構設計離不開集群,集群同樣離不開Socket。Socket技術可以實現不同計算機間的數據通信,從而實現在集群中的服務器之間進行數據交換,因此,Socket技術是必須要學習的,它也是工作、面試時經常涉及的知識點。即使你是一位Java語言Socket技術的初學者,如果有C++語言學習的經驗,那么在學習Socket技術時會覺得得心應手,因為Java語言中的Socket技術其實是封裝了操作系統中Socket編程的API,示例代碼如下:
JNIEXPORT jobject JNICALL Java_java_net_NetworkInterface_getByIndex0 (JNIEnv *env, jclass cls, jint index) { netif *ifList, *curr; jobject netifObj = NULL; //Retained for now to support IPv4 only stack, java.net.preferIPv4Stack if (ipv6_available()) { return Java_java_net_NetworkInterface_getByIndex0_XP (env, cls, index); } /* get the list of interfaces */ if (enumInterfaces(env, &ifList) < 0) { return NULL; } /* search by index */ curr = ifList; while (curr ! = NULL) { if (index == curr->index) { break; } curr = curr->next; } /* if found create a NetworkInterface */ if (curr ! = NULL) { netifObj = createNetworkInterface(env, curr, -1, NULL); } /* release the interface list */ free_netif(ifList); return netifObj; }
上面的代碼片段出自:http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/73a9fef98b93/src/windows/native/java/net/NetworkInterface.c。
從上述代碼片段中可以發現,使用Java語言開發Socket軟件時,內部調用的還是基于操作系統的Socket的API。
如果沒有C++編程經驗,就不能學習Java中的Socket技術嗎?其實也不是,JDK已經將Socket技術進行了重量級的封裝,可以用最簡單的代碼實現復雜的功能,API接口設計得簡潔、有序,因此,即使不懂C++,也能順利地學習Socket編程。掌握C++語言其實是更有益于學習底層對Socket的封裝,研究一些細節問題時會應用到。在常規的學習時,掌握C++語言似乎就沒有這么大的幫助了。
Socket技術基于TCP/IP,提前了解一些協議的知識更有利于學習Socket。但是TCP/IP規范非常復雜,我們不可能把該協議的所有細節都掌握,只需要掌握TCP與UDP里常規的內容即可,因為這是Socket技術實現網絡通信主要使用的協議。是否有書籍把TCP/UDP的理論知識和Socket編程結合起來?真的有這樣的書,推薦《UNIX網絡編程(卷1):套接字聯網API》和《UNIX網絡編程(卷2):進程間通信》。這兩本書就將TCP/UDP/Socket進行整合并介紹,對TCP和UDP的細節進行文字講述,并且使用Socket API進行代碼的演示,但是演示的代碼使用的是C語言實現的,并不是Java,但Java程序員可以以這兩本書作為TCP/UDP理論知識的參考。如果你想更加深入、細致地研究TCP/IP編程,這兩本書會提供很大幫助。
Socket編程其實就是實現服務端與客戶端的數據通信,不管使用任何的編程語言,在實現上基本上都是4個步驟:①建立連接;②請求連接;③回應數據;④結束連接,這4個步驟的流程圖如圖1-3所示。

圖1-3 Socket編程流程圖
雖然圖1-3中使用C語言實現Socket編程,但同樣可以使用Java中的ServerSocket和Socket類來代替并實現網絡通信。本書中Socket的所有案例都是在這4個步驟的生命周期中再結合ServerSocket和Socket類產生的。
另外,本書是將NIO與Socket相結合的,在學習NIO之前,必須先學習Socket,因為NIO中的核心通道類都是基于Socket技術的通道類。學習Socket時要著重學習Socket Option特性,因為它會影響程序運行的效率。在網絡程序優化時,除了優化代碼之外,還要優化Socket Option中的參數。本書將Socket有關類中的API幾乎進行了全部講解,因為筆者不希望只列舉常用代碼,而其他知識點一帶而過或根本不介紹的情況發生。學習技術時就要以“全面覆蓋,某點深鉆”的方式進行全方位學習,這樣在閱讀第三方框架的源代碼時才不會出現現查API的情況,極大地提高了代碼閱讀效率,也會對TCP/IP編程有更深的認識。
(4)NIO
什么是NIO?百度百科中的解釋如圖1-4所示:

圖1-4 百度百科解釋的NIO
大致來講,NIO相比普通的I/O提供了功能更加強大、處理數據更快的解決方案,它可以大大提高I/O(輸入/輸出)吞吐量,常用在高性能服務器上。隨著互聯網的發展,在大多數涉及Java高性能的應用軟件中,NIO是必不可少的技術之一。
NIO實現高性能處理的原理是使用較少的線程來處理更多的任務,如圖1-5所示。

圖1-5 NIO高性能的核心原理圖
使用較少的Thread線程,通過Selector選擇器來執行不同Channel通道中的任務,執行的任務再結合AIO(異步I/O)就能發揮服務器最大的性能,大大提升軟件運行效率。
通過對前面4個核心技術的簡單介紹,至少你的思維中不再只是Struts、Spring、Hibernate、MyBatis、SpringMVC、CSS、jQuery、AJAX等這些Java Web技術了,而是需要思考如何組織軟件架構、服務器分布、通信優化、高性能處理等這些高級技能,為以后的學習和工作打下堅實的技術基礎。
學習NIO能更加接近和了解架構級的技術體系,對未來的職業發展有非常好的輔助作用。
- Vue.js設計與實現
- Android和PHP開發最佳實踐(第2版)
- Boost C++ Application Development Cookbook(Second Edition)
- 少年輕松趣編程:用Scratch創作自己的小游戲
- NativeScript for Angular Mobile Development
- Learning ArcGIS Pro
- 網站構建技術
- Mastering Android Development with Kotlin
- Getting Started with LLVM Core Libraries
- Kotlin編程實戰:創建優雅、富于表現力和高性能的JVM與Android應用程序
- SQL Server數據庫管理與開發兵書
- AutoCAD 2009實訓指導
- Unity 2018 Augmented Reality Projects
- Python預測分析與機器學習
- MongoDB Administrator’s Guide