傳統(tǒng)的 Java I/O API 在應(yīng)對不同的傳輸協(xié)議時需要使用不同的類型和方法。例如:java.net.Socket 和 java.net.DatagramSocket 它們并不具有相同的超類型,因此,這就需要使用不同的調(diào)用方式執(zhí)行 socket 操作。
這種模式上的不匹配使得在更換一個網(wǎng)絡(luò)應(yīng)用的傳輸協(xié)議時變得繁雜和困難。由于(Java I/O API)缺乏協(xié)議間的移植性,當(dāng)你試圖在不修改網(wǎng)絡(luò)傳輸層的前提下增加多種協(xié)議的支持,這時便會產(chǎn)生問題。并且理論上講,多種應(yīng)用層協(xié)議可運行在多種傳輸層協(xié)議之上例如TCP/IP,UDP/IP,SCTP和串口通信。
讓這種情況變得更糟的是,Java 新的 I/O(NIO)API與原有的阻塞式的I/O(OIO)API 并不兼容,NIO.2(AIO)也是如此。由于所有的API無論是在其設(shè)計上還是性能上的特性都與彼此不同,在進(jìn)入開發(fā)階段,你常常會被迫的選擇一種你需要的API。
例如,在用戶數(shù)較小的時候你可能會選擇使用傳統(tǒng)的 OIO(Old I/O) API,畢竟與 NIO 相比使用 OIO 將更加容易一些。然而,當(dāng)你的業(yè)務(wù)呈指數(shù)增長并且服務(wù)器需要同時處理成千上萬的客戶連接時你便會遇到問題。這種情況下你可能會嘗試使用 NIO,但是復(fù)雜的 NIO Selector 編程接口又會耗費你大量時間并最終會阻礙你的快速開發(fā)。
Netty 有一個叫做 Channel 的統(tǒng)一的異步 I/O 編程接口,這個編程接口抽象了所有點對點的通信操作。也就是說,如果你的應(yīng)用是基于 Netty 的某一種傳輸實現(xiàn),那么同樣的,你的應(yīng)用也可以運行在 Netty 的另一種傳輸實現(xiàn)上。Netty 提供了幾種擁有相同編程接口的基本傳輸實現(xiàn):
切換不同的傳輸實現(xiàn)通常只需對代碼進(jìn)行幾行的修改調(diào)整,例如選擇一個不同的 ChannelFactory 實現(xiàn)。
此外,你甚至可以利用新的傳輸實現(xiàn)沒有寫入的優(yōu)勢,只需替換一些構(gòu)造器的調(diào)用方法即可,例如串口通信。而且由于核心 API 具有高度的可擴展性,你還可以完成自己的傳輸實現(xiàn)。
更多建議: