Mina文件 01- 入門
入門
NIO概述
NIO API是在Java 1.4中引入的,後來被用於大量應用程式。 NIO API涵蓋IO非阻塞操作。
首先,很高興知道MINA是在NIO 1之上編寫的。在Java 7,NIO-2中設計了一個新版本,我們還沒有從這個版本帶來的附加功能中受益。
同樣重要的是要知道NIO中的N表示New,但我們將在許多地方使用Non-Blocking術語。 NIO-2應被視為新的I / O ......
java.nio.*包中包含以下關鍵結構
Buffers - 資料容器
Chartsets - 用於位元組和Unicode的容器轉換器
Channels - 表示與能夠進行I / O操作的實體的連線
Selectors - 提供可選擇的多路複用非阻塞IO
Regexps - 提供一些工具來操作正則表示式
我們最感興趣的是MINA框架中的Channels,_ Selectors_和Buffers部分,除了我們想要將這些元素隱藏到使用者。
因此,本使用者指南將重點關注構建在這些內部元件之上的所有內容。
NIO vs BIO
瞭解這兩個API之間的區別非常重要。 BIO或Blocking IO依賴於阻塞模式中使用的普通套接字:當您在套接字上讀取,寫入或執行任何操作時,被呼叫的操作將阻塞呼叫者通知直到操作完成。
在某些情況下,能夠呼叫操作並期望被呼叫的操作在操作完成時通知呼叫者是至關重要的:呼叫者可以在同一時間執行其他操作。
當你有許多連線的套接字時,這也是NIO提供更好的處理IO的方法:你不必為每個連線建立一個特定的執行緒,你可以只使用幾個執行緒來完成同樣的工作。
如果你想獲得有關NIO的更多資訊,網上有很多好文章,還有一些書可以解決這個問題。
為何選擇MINA?
編寫網路應用程式通常被視為負擔並被視為低級別開發。這是一個開發人員不經常研究或瞭解的領域,要麼是因為它已經在學校很久以前就被研究過了,而且一切都被遺忘了,或者因為網路層的複雜性經常被更高層次的層隱藏,所以你從來沒有深入到它。
除此之外(當談到非同步IO時)還會產生額外的複雜性:時間。
BIO(阻塞IO)和NIO(非阻塞IO)之間的最大區別在於,在BIO中,您傳送請求,並等到獲得響應。在伺服器端,這意味著一個執行緒將與任何傳入連線相關聯,因此您不必處理多路複用連線的複雜性。另一方面,在NIO中,您必須處理非阻塞系統的同步特性,這意味著在發生某些事件時將呼叫您的應用程式。在NIO中,您不會呼叫並等待結果,您傳送命令並在結果準備好時通知您。
需要一個框架
考慮到這些差異,以及大多數應用程式在呼叫網路層時通常期望阻塞模式的事實,最好的解決方案是通過編寫模仿阻塞模式的框架來隱藏這一方面。這就是MINA所做的!
但MINA做得更多。它為需要通過TCP,UDP或任何機制進行通訊的應用程式提供了一個通用的IO願景。如果我們只考慮TCP和UDP,則一個是連線協議(TCP),另一個是無連線(UDP)。 MINA掩蓋了這種差異,使您專注於對您的應用非常重要的兩個部分:應用程式程式碼和應用程序協議編碼/解碼。
MINA *不僅處理TCP和UDP,還通過VmpPipe或APR **在序列通訊(RSC232)之上提供一層。
最後但同樣重要的是,MINA是一個專門設計用於客戶端和伺服器端的網路框架。編寫伺服器使得在效能和記憶體使用方面具有可調整的系統至關重要,該系統可調整以滿足伺服器需求。這就是MINA的優點,使您可以輕鬆開發伺服器。
何時使用MINA?
這是一個有趣的問題!MINA不期望在所有情況下都成為最佳選擇。在考慮使用MINA時,需要考慮一些因素。我們列出它們:
易用性 - 當您沒有特殊的效能要求時,MINA可能是一個不錯的選擇,因為它允許您輕鬆地開發伺服器或客戶端,而無需處理在頂部編寫相同應用程式時處理的各種引數和用例BIO或NIO。你可能只用幾行程式碼編寫你的伺服器,並且你可能會陷入更少的陷阱。
大量連線使用者BIO明顯比NIO快。 差異是30%贊成BIO。 對於成千上萬的連線使用者來說,情況確實如此,但連線數到了某一個點,BIO方法只是停止擴充套件; 您將無法使用每個使用者一個執行緒處理數百萬連線使用者! NIO可以。 現在,另一個方面是,與您的應用程式將消耗的任何內容相比,在程式碼的MINA部分中花費的時間可能並不重要。 在某些時候,花費精力嘗試自己編寫一個更快的網路層以獲得幾乎無法察覺的增益可能是不值得的。
經過驗證的系統MINA被世界各地的許多應用程式使用。有一些基於MINA的Apache專案,它們執行良好。這可以簡化你的思路而不必在自己的網路層實現中花費數小時來處理一些神祕錯誤。
現有支援的協議MINA附帶了各種實現的協議:HTTP,XML,TCP,LDAP,DHCP,NTP,DNS,XMPP,SSH,FTP ......在某些時候,MINA不僅可以看作是NIO框架,而且可以看作是網路層與一些協議實現。在不久的將來,MINA可能會提供更廣泛的協議供您使用。
特性
MINA是一個簡單但功能齊全的網路應用程式框架,它提供:
適用於各種傳輸型別的統一API:
通過Java NIO實現TCP / IP和UDP / IP
通過RXTX進行序列通訊(RS232)
虛擬機器管道通訊
你可以實現自己的!
過濾介面作為擴充套件點;類似於Servlet過濾器
低階和高階API:
低階:使用ByteBuffers
高階:使用使用者定義的訊息物件和編解碼器
高度可定製的執行緒模型:
單執行緒
一個執行緒池
多個執行緒池(即SEDA)
開箱即用的SSL·TLS·使用Java 5 SSLEngine支援StartTLS
過載遮蔽和流量限制
使用模擬物件的單元可測試性
JMX管理
通過StreamIoHandler支援基於流的I / O.
與知名的容器整合,如PicoContainer和Spring
從Apache MINA的祖先Netty順利遷移
第一步
我們將向您展示使用MINA是多麼容易,執行MINA包提供的一個非常簡單的示例。
您需要做的第一件事是在您的應用程式中使用MINA時設定環境。我們將描述您需要安裝的內容以及如何執行MINA程式。沒什麼花哨,只是MINA的第一次嘗試......
下載
首先,您必須從下載部分下載最新的MINA版本。只要拿最新版本,除非你有充分的理由不這樣做......
一般來說,如果你打算使用Maven來構建你的專案,你甚至不需要下載任何東西,只要你依賴已經包含MINA庫的儲存庫:你只需告訴你想要的Maven poms你想要的東西使用你需要的MINA jars。
裡面有什麼
下載完成後,將tar.gz或zip檔案的內容解壓縮到本地硬碟。下載的壓縮檔案具有以下內容
在UNIX系統上,鍵入:
$ tar xzpf apache-mina-2.0.7-tar.gz
在apache-mina-2.0.7目錄中,您將獲得:
| +- dist +- docs +- lib +- src +- LICENSE.txt +- LICENSE.jzlib.txt +- LICENSE.ognl.txt +- LICENSE.slf4j.txt +- LICENSE.springframework.txt +- NOTICE.txt
內容清單
dist - 包含MINA庫程式碼的jar
docs - 包含API文件和程式碼外部參照
lib - 包含使用MINA所需的所有庫所需的所有jar
除此之外,基本目錄還有幾個許可證和通知檔案
執行你的第一個MINA程式
好吧,我們已經下載了這個版本,讓我們執行我們釋出的第一個MINA示例。
將以下jar放入類路徑中:
- mina-core-2.0.7.jar
- mina-example-2.0.7.jar
- slf4j-api-1.6.6.jar
- slf4j-log4j12-1.6.6.jar
- log4j-1.2.17.jar
日誌提示:
- Log4J 1.2 users: slf4j-api.jar, slf4j-log4j12.jar, and Log4J 1.2.x
- Log4J 1.3 users: slf4j-api.jar, slf4j-log4j13.jar, and Log4J 1.3.x
- java.util.logging users: slf4j-api.jar and slf4j-jdk14.jar
- 重要提示:請確保使用與您的日誌記錄框架匹配的正確的slf4j - * .jar。例如,slf4j-log4j12.jar和log4j-1.3.x.jar不能一起使用,並且會出現故障。如果您不需要日誌記錄框架,則可以使用slf4j-nop.jar進行無日誌記錄,或使用slf4j-simple.jar進行非常基本的日誌記錄。
在命令提示符下,發出以下命令:
$ java org.apache.mina.example.gettingstarted.timeserver.MinaTimeServer
這將啟動伺服器。現在telnet並看到該程式在行動 發出以下telnet命令
telnet 127.0.0.1 9123
好吧,我們已經開始執行我們的第一個MINA計劃。請嘗試使用MINA附帶的其他示例程式作為示例。
總結
在本章中,我們研究了基於MINA的應用程式架構,用於客戶端和伺服器。我們還討論了示例TCP伺服器/客戶端以及UDP伺服器和客戶端的實現。
在接下來的章節中,我們將討論MINA核心構造和高階主題。
參考
http://mina.apache.org/mina-project/userguide/ch1-getting-started/ch1-getting-started.html