Apache mina2使用者指南(一)
阿新 • • 發佈:2019-01-29
Apache MINA 2.0 使用者指南》系列部落格總序
NIO API 是由 Java 1.4 引入的,從此被廣泛用於各種應用。 NIO API
封裝了 IO 非阻塞操作。
首先,最好了解一下 MINA 是基於 NIO 1 寫的。Java 7 設計了一個新版本 NIO-2,(因為我們基於 NIO 1) 我們並沒有從這一版本 (NIO-2) 所帶來的新加功能中獲益。
也有必要了解到 NIO 中的 N 意思是 New,但是我們在很多地方將不會使用 Non-Blocking (非阻塞) 術語。NIO-2 應該被視為一個新新 (New New) I/O...
java.nio.* 包包含了以下關鍵構造
很有必要來了解一下這兩個 API 之間的差別。BIO,或者叫做 Blocking IO,依賴於用於阻塞模式的普通套接字:在你在套接字上進行讀、寫或者任何操作的時候,被呼叫的操作在操作結束之前將會一直阻塞住呼叫者。
在某些情況下,能夠呼叫這些操作是很重要的,並且希望被呼叫的操作在其操作結束之後能夠通知呼叫者:這樣呼叫者在這段時間之內可以做一些其他的事情。
這也是在你具有眾多連線的套接字時 NIO 所能提供的一個更好的方式的地方:你無須為每個連線建立一個特定的執行緒,你僅僅需要很少的幾個來做同樣事情的執行緒。
寫網路應用常常被視作一種高負擔但低水平的開發。這是一個不經常為程式設計師所學習或者瞭解的領域,這可能是因為這些內容是在很久以前在學校裡學過但都忘光了,也可能是因為這一網路層的複雜性常常被更高層的傳輸層所隱藏以致你從來沒有深入它。
補充一點,當涉及到非同步 IO 時,一個額外的複雜的層出場了:時間。
BIO (Blocking IO,阻塞 IO) 和 NIO (Non-Blocking IO,非阻塞 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 之前要思考幾個要素:
基於 RXTX 的 序列通訊 (RS232)
In-VM 通道通訊
你可以實現你自己的!
高層:使用使用者定義的訊息物件和編解碼器
一個執行緒池
多個執行緒池 (比如 SEDA)
我們將通過執行一個 MINA 包提供的很簡單的例子給你演示使用 MINA 是多麼簡單。
想要在你的應用中使用 MINA 的第一件事是要設定環境。我們將描述你需要安裝什麼,以及如何執行一個 MINA 程式。沒啥大不了的,先來體驗一下MINA 吧 ...
下載
首先,你需要從下載區下載到最新 MINA 釋出版。建議選擇最新版,除非你有非常好的理由不這麼做 ...
一般來說,如果你要使用 Maven 來構建你的專案,你甚至不需要下載任何東西,你只需依賴進一個包含了 MINA 庫的 repository:也就是說你只需告訴 Maven pom 你需要使用 MINA 包。
裡邊是什麼
下載完成後,將 tar.gz 或 zip 檔案的內容釋放到本地磁碟。下載的壓縮檔案具有以下內容。
在 UNIX 系統,輸入:
[plain] view plain copy print?
你將會在 apache-mina-2.0.7 目錄下得到以下內容:
[plain] view plain copy print?
內容詳情
下載完釋出版之後,讓我們執行一下發布版附帶的第一個 MINA 例子吧。
將以下包放進 classpath
*Log4J 1.2 使用者:slf4j-api.jar、slf4j-log4j12.jar;
Log4J 1.2.x * Log4J 1.3 使用者:slf4j-api.jar、slf4j-log4j13.jar;
Log4J 1.3.x * java.util.logging 使用者:slf4j-api.jar 和 slf4j-jdk14.jar。
重要提示:請確認你使用了匹配於你的日誌框架的正確的 slf4j-*.jar。例如,slf4j-log4j12.jar 和 log4j-1.3.x.jar 不能夠同時使用,否則會發生故障。如果你不需要一個日誌框架,你可以使用沒有日誌的 slf4j-nop.jar 或者僅有最基本日誌的 slf4j-simple.jar。
在命令列中輸入以下命令:
[plain] view plain copy print?
這將啟動伺服器。現在 telnet 將會看到程式已啟動。
輸入以下命令來 telnet:
[plain] view plain copy print?
在本章中,我們瞭解了基於 MINA 的客戶端以及伺服器端的應用體系。我們還涉及了 TCP 服務端/客戶端、UDP 伺服器端和客戶端的例子實現。
在接下來的章節中我們將會討論 MINA 的核心結構以及一些高階主題。
原文連結:http://mina.apache.org/mina-project/userguide/ch1-getting-started/ch1-getting-started.html。
《Apache MINA 2.0 使用者指南》取材自 Apache 官方指南,共分十七章,此係列部落格完本後,筆者會整理一份中英文對照閱讀的 PDF 文件,屆時將公佈下載地址。敬請期待。
《Apache MINA 2.0 使用者指南》第一章:入門本章中,我們將給你關於什麼是 MINA、什麼是 NIO、我什麼我們在 NIO 之上開發了一個框架以及你會在其中找到什麼等等的第一認識。我們也將會給你演示如何在一臺 MINA 的伺服器上執行一個很簡單的例子。
NIO 概述NIO API 是由 Java 1.4 引入的,從此被廣泛用於各種應用。
首先,最好了解一下 MINA 是基於 NIO 1 寫的。Java 7 設計了一個新版本 NIO-2,(因為我們基於 NIO 1) 我們並沒有從這一版本 (NIO-2) 所帶來的新加功能中獲益。
也有必要了解到 NIO 中的 N 意思是 New,但是我們在很多地方將不會使用 Non-Blocking (非阻塞) 術語。NIO-2 應該被視為一個新新 (New New) I/O...
java.nio.* 包包含了以下關鍵構造
- Buffers (緩衝) - 資料容器
- Chartsets (字符集) - 位元組和 Unicode 碼的翻譯容器
- Channels (通道) - 表示實體 I/O 操作的連線
- Selectors (選擇器) - 提供可選擇的、多路非阻塞 IO
- Selectors (正則表示式) - 提供一些操作正則表示式的工具
本使用者指南因此將把重點放在基於這些內部元件構建的每個物件上。
NIO vs BIO很有必要來了解一下這兩個 API 之間的差別。BIO,或者叫做 Blocking IO,依賴於用於阻塞模式的普通套接字:在你在套接字上進行讀、寫或者任何操作的時候,被呼叫的操作在操作結束之前將會一直阻塞住呼叫者。
在某些情況下,能夠呼叫這些操作是很重要的,並且希望被呼叫的操作在其操作結束之後能夠通知呼叫者:這樣呼叫者在這段時間之內可以做一些其他的事情。
這也是在你具有眾多連線的套接字時 NIO 所能提供的一個更好的方式的地方:你無須為每個連線建立一個特定的執行緒,你僅僅需要很少的幾個來做同樣事情的執行緒。
如果你想獲得涵蓋有 NIO 的更多資訊,網際網路上有很多相關的不錯的文章,也有一些關於這方面內容的出版的書籍。
Why MINA?寫網路應用常常被視作一種高負擔但低水平的開發。這是一個不經常為程式設計師所學習或者瞭解的領域,這可能是因為這些內容是在很久以前在學校裡學過但都忘光了,也可能是因為這一網路層的複雜性常常被更高層的傳輸層所隱藏以致你從來沒有深入它。
補充一點,當涉及到非同步 IO 時,一個額外的複雜的層出場了:時間。
BIO (Blocking IO,阻塞 IO) 和 NIO (Non-Blocking IO,非阻塞 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:
基於 RXTX 的 序列通訊 (RS232)
In-VM 通道通訊
你可以實現你自己的!
- 過濾器介面作為擴充套件點;類似於 Servlet 過濾器
- 低層和高層 API:
高層:使用使用者定義的訊息物件和編解碼器
- 高可定製化的執行緒模型:
一個執行緒池
多個執行緒池 (比如 SEDA)
- 使用 Java 5 SSLEngine 的開箱可用的 SSL · TLS · StartTLS 支援
- 超負載保護和流量調節
- 使用模擬物件單元測試
- JMX 可管理性
- 使用 StreamIoHandler 的基於流的 I/O 支援
- 知名容器諸如 PicoContainer 和 Spring 的整合
- 從 Netty 的平滑遷移,Apache MINA 繼承於 Netty
我們將通過執行一個 MINA 包提供的很簡單的例子給你演示使用 MINA 是多麼簡單。
想要在你的應用中使用 MINA 的第一件事是要設定環境。我們將描述你需要安裝什麼,以及如何執行一個 MINA 程式。沒啥大不了的,先來體驗一下MINA 吧 ...
下載
首先,你需要從下載區下載到最新 MINA 釋出版。建議選擇最新版,除非你有非常好的理由不這麼做 ...
一般來說,如果你要使用 Maven 來構建你的專案,你甚至不需要下載任何東西,你只需依賴進一個包含了 MINA 庫的 repository:也就是說你只需告訴 Maven pom 你需要使用 MINA 包。
裡邊是什麼
下載完成後,將 tar.gz 或 zip 檔案的內容釋放到本地磁碟。下載的壓縮檔案具有以下內容。
在 UNIX 系統,輸入:
[plain] view plain copy print?
- $ tar xzpf apache-mina-2.0.7-tar.gz
你將會在 apache-mina-2.0.7 目錄下得到以下內容:
[plain] view plain copy print?
- |
- +- 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 例子吧。
將以下包放進 classpath
- 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 使用者:slf4j-api.jar、slf4j-log4j12.jar;
Log4J 1.2.x * Log4J 1.3 使用者:slf4j-api.jar、slf4j-log4j13.jar;
Log4J 1.3.x * java.util.logging 使用者:slf4j-api.jar 和 slf4j-jdk14.jar。
重要提示:請確認你使用了匹配於你的日誌框架的正確的 slf4j-*.jar。例如,slf4j-log4j12.jar 和 log4j-1.3.x.jar 不能夠同時使用,否則會發生故障。如果你不需要一個日誌框架,你可以使用沒有日誌的 slf4j-nop.jar 或者僅有最基本日誌的 slf4j-simple.jar。
在命令列中輸入以下命令:
[plain] view plain copy print?
- $ java org.apache.mina.example.gettingstarted.timeserver.MinaTimeServer
這將啟動伺服器。現在 telnet 將會看到程式已啟動。
輸入以下命令來 telnet:
[plain] view plain copy print?
- 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。