基于MINA框架快速開發網絡應用程序

1.MINA框架簡介

Netty、Mina、Cindy都是不錯的NIO開源框架,后兩者都是在Netty的基礎上演化出來的。
MINA(Multipurpose Infrastructure for Network Applications)是用于開發高性能和高可用性的網絡應用程序的基礎框架。通過使用MINA框架可以可以省下處理底層I/O和線程并發等復雜工作,開發人員能夠把更多的精力投入到業務設計和開發當中。MINA框架的應用比較廣泛,應用的開源項目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架當前穩定版本是1.1.7,最新的2.0版本目前已經發布了RC1版本。
MINA框架的特點有:基于java NIO類庫開發;采用非阻塞方式的異步傳輸;事件驅動;支持批量數據傳輸;支持TCP、UDP協議;控制反轉的設計模式(支持Spring);采用優雅的松耦合架構;可靈活的加載過濾器機制;單元測試更容易實現;可自定義線程的數量,以提高運行于多處理器上的性能;采用回調的方式完成調用,線程的使用更容易。

2.MINA框架的常用類
類NioSocketAcceptor用于創建服務端監聽;
類NioSocketConnector用于創建客戶端連接;
類IoSession用來保存會話屬性和發送消息;
類IoHandlerAdapter用于定義業務邏輯,常用的方法有:
方法 定義
sessionCreated() 當會話創建時被觸發
sessionOpened() 當會話開始時被觸發
sessionClosed() 當會話關閉時被觸發
sessionIdle() 當會話空閑時被觸發
exceptionCaught() 當接口中其他方法拋出異常未被捕獲時觸發此方法
messageRecieved() 當接收到消息后被觸發
messageSent() 當發送消息后被觸發


3.服務端應用開發示例
下面將以MINA2.0M1版本為基礎,通過一個范例來演示一下如何使用MINA框架進行開發。開發環境為jdk6.0,開發工具NetBeans6.0,所需jar包slf4j-api.jar、slf4j-jdk14.jar、MINA-core-2.0.0-M1.jar。
首先定義一個業務邏輯處理器TimeServerHandler,繼承自IoHandlerAdapter,實現的功能有:當客戶端創建會話時會顯示客戶端設備的IP和端口;當客戶端輸入quit時結束會話;客戶端輸入其它內容時則向客戶端發送當前時間。代碼如下:
public class TimeServerHandler extends IoHandlerAdapter
{
@Override
public void sessionCreated(IoSession session) {
//顯示客戶端的ip和端口
System.out.println(session.getRemoteAddress().toString());
}
@Override
public void messageReceived( IoSession session, Object message ) throws Exception
{
String str = message.toString();
if( str.trim().equalsIgnoreCase("quit") ) {
session.close();//結束會話
return;
}
Date date = new Date();
session.write( date.toString() );//返回當前時間的字符串
System.out.println("Message written...");
}
}
再定義一個類MinaTimeServer用來啟動服務端:
public class MinaTimeServer
{
private static final int PORT = 9123;//定義監聽端口
public static void main( String[] args ) throws IOException
{
IoAcceptor acceptor = new NioSocketAcceptor();
acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));//指定編碼過濾器
acceptor.setHandler( new TimeServerHandler() );//指定業務邏輯處理器
acceptor.setDefaultLocalAddress( new InetSocketAddress(PORT) );//設置端口號
acceptor.bind();//啟動監聽
}
}

4.測試
首先運行MinaTimeServer,啟動服務端,接著在命令行運行“telnet 127.0.0.1 9123”,來登錄,這時會看到服務端輸出如下:
2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log
/10.64.2.137:4140 ?IP和端口號
信息: CREATED
2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log
信息: OPENED 在客戶端輸入回車,在客戶端可以看到服務端返回當前的時間:
Thu Feb 21 16:20:14 CST 2008
服務端輸出:
2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log
信息: RECEIVED: HeapBuffer[pos=0 lim=2 cap=2048: 0D 0A] ?接收收到回車符
Message written...
2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log
信息: SENT: HeapBuffer[pos=0 lim=29 cap=30: 54 68 75 20 46 65 62 20 32 31 20 31 36 3A 32 30...]
2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log
信息: SENT: HeapBuffer[pos=0 lim=0 cap=0: empty] 5.客戶端開發示例
首先定義類TimeClientHandler來處理消息接收事件:
class TimeClientHandler extends IoHandlerAdapter{
public TimeClientHandler() {
}
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
System.out.println(message);//顯示接收到的消息
}
}
接著定義MinaTimeClient類用于連接服務端,并向服務端發送消息:
public class MinaTimeClient {
public static void main(String[] args) {
// 創建客戶端連接器.
NioSocketConnector connector = new NioSocketConnector();
connector.getFilterChain().addLast( "logger", new LoggingFilter() );
connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" )))); //設置編碼過濾器
connector.setConnectTimeout(30);
connector.setHandler(new TimeClientHandler());//設置事件處理器
ConnectFuture cf = connector.connect(
new InetSocketAddress("127.0.0.1", 9123));//建立連接
cf.awaitUninterruptibly();//等待連接創建完成
cf.getSession().write("hello");//發送消息
cf.getSession().write("quit");//發送消息
cf.getSession().getCloseFuture().awaitUninterruptibly();//等待連接斷開
connector.dispose();
}
}
6.總結
通過上述示例可以了解到:使用MINA框架來開發的網絡應用程序代碼結構更清晰;MINA框架完成了底層的線程管理;MINA內置的編碼器可以滿足大多數用戶的需求,省去了開發人員消息編碼解碼的工作。具稱使用MINA開發服務器程序的性能已經逼近使用 C/C++ 語言開發的網絡服務。因此,建議在網絡應用程序開發過程中嘗試使用MINA框架來提高我們的開發效率和應用程序的執行效率。

轉自 http://www.javaeye.com/topic/166596

參考:http://xinsync.xju.edu.cn/index.php/archives/category/prglang/java/mina

轉載于:https://www.cnblogs.com/SmileGelila/archive/2010/10/22/2075409.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378929.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python中@staticmethod和@classmethod之間的區別

classmethod裝飾器 (The classmethod Decorator) The classmethod decorator is an inbuilt function decorator that gets evaluated after the function is defined. The result of the evaluation shadows the function definition. The classmethods first argument is alw…

go 聲明二維數組_一篇文章了解Go語言中數組Arrays的使用內幕

概述與其他編程語言類似,Go語言也有數組array。Go語言中,數組的行為和其他語言沒有什么不同.Go語言中還有一個叫做切片slice的東西,它就像是對數組的引用。在本文中,我們將只研究數組。定義數組是同一類型元素的連續集合&#xff…

ffmpeg 使用ffplay 進行 hls 拉流 分析 1

ffmpeg 使用 ffplay 進行 hls 拉流 分析 1 從使用ffplay 調用 http://192.168.1.100:8080/live/livestream.m3u8 開始,進入到ffmpeg 的分析使用的協議選擇相應的解復用器的步驟。 其他協議或者文件方式的使用ffplay也是這個步驟流程的。 目錄:一、流程圖…

搜狗輸入法輸出特殊符號快捷鍵

https://www.petefreitag.com/cheatsheets/ascii-codes/ 參考上個編碼網站大全 詳細步驟為:alt長按 + 編碼數字 例如:平方的編碼為178-----長按alt178 即可,178是數字一個一個挨個按即可 常用的特殊符號如下: 平方&…

echo 12345678 | base64 產生的結果跟12345678真正的base64編碼不對

echo "12345678" | base64 產生的結果跟"12345678"真正的base64編碼不對 弄了好久才搞清楚,echo 命令是帶換行符的,改成echo -n "12345678" | base64就沒問題了轉載于:https://www.cnblogs.com/senix/archive/2013/01/30/…

[BuildRelease Management]CC.NET架構

一 CC.NET的操作流程 1) 等待Trigger的喚醒; 2)從Source Control System查詢上次build以后的修改列表; 3)如果任何修改被發現或是Trigger觸發類型為 force the build : 3.1)為build產生一個label number&a…

python 入門到實踐期末考試常出現的考試內容_Python編程入門到實踐—列表篇(一)...

一、列表是什么?列表由一系列按特定順序排列的元素組成。可以創建包含字母表中所有字母、數字0-9或所有家庭成員姓名的列表;也可以將任何東西加入列表中,其中的元素之間可以沒有任何關系。列表通常包含多個元素,給列表指定一個表示…

c#中將集合寫入文本_在C#中將記錄插入MySQL數據庫

c#中將集合寫入文本In the last tutorial (how to connect with MySQL database in C#?), we learned about making the connection with MySQL database in C#. Here, in this tutorial, we will learn how to insert the records in MySQL database in C#? 在上一教程( 如何…

read/fread write/fwrite 的區別

fread就是通過read來實現的,fread是C語言的庫,而read是系統調用。 差別在read每次讀的數據是調用者要求的大小,比如調用者要求讀取10個字節數據,read就會從內核緩沖區(操作系統開辟的一段空間用來存儲磁盤上的數據&am…

如何在子網中訪問上層網絡的計算機文件夾

場景 公司路由器A,直接接外部網線,內部ip192.168.11.1,lan口又接了路由器A1,IP為192.168.11.2,A1的lan端口接了一臺電腦A,Ip為192.168.0.2,接了另外一個路由A2,Ip為192.168.11.3&…

基于Web的套打方案分析

應用web化,不論對開發商,還是對用戶來說,實在是一種很經濟的選擇,因為基于web的應用,客戶端的規則很簡單,容易學習,容易維護,容易發布。但對程序員來說,因為瀏覽器的局限…

day1-Linux操作系統基礎

該專欄所有內容筆記均來自傳智播客培訓班 1.什么是操作系統(operate system OS) 小議:承上啟下作用,向下可以控制硬件,向上能夠支持軟件的運行。一個可以控制硬件的軟件。 小明找小紅聊天,小明打開QQ&…

關閉瀏覽器 清空session_跨境網絡小知識之Session

跨境小伙伴們大家好,上一篇為大家介紹了Cookie,今天就為大家介紹下連接cookie的另一端Session,交互過程中,二者缺一不可。與Cookie相對,Session是存儲在服務端的,他們之間是通過一個叫做sessionID的東東建立…

我和乘子交替方向法admm_找到最大和交替子序列

我和乘子交替方向法admmProblem statement: 問題陳述: Given a sequence of numbers, you have to find the maximum sum alternating subsequence and print the value. A sequence is an alternating sequence when it will be maintain like (increasing) ->…

Dojo學習筆記(一):Hello Dojo!

歡迎來到Dojo世界!在這篇文章中你將會學習到如何加載Dojo以及探索Dojo的一些核心功能。你還會了解Dojo的基于AMD的模塊架構,探索如何加載額外的模塊來增加功能到您的Web站點或應用程序,并找出在出錯的時如何得到幫助。讓我們開始吧 開始學習D…

轉:我眼中的Visual Studio 2010架構工具

來自:http://www.cnblogs.com/wayfarer/archive/2010/07/30/1788398.html我眼中的Visual Studio 2010架構工具影響架構質量的是構建體系架構的思想、原則、實踐與架構師的經驗,絕不是工具。即使是最優秀的架構工具,也不可能像倚天寶劍一般——…

VMware創建Ubuntu操作系統到網絡配置詳細流程

一、創建虛擬機 Ubuntu下載鏈接 1,看個人需求了,有更高的版本,下載Ubuntu鏡像 2,VMware官網隨便下載即可 3,創建新的虛擬機 4,自定義 5,默認即可 6,稍后安裝操作系統 7&#xf…

djiango配置mysql_數據庫MySQL相關環境配置以及數據庫與Go的連接

Linux下安裝好MySQL后,Windows安裝可視化工具navicatLinux下MySQL與Windows下navicat進行連接:安裝的過程很是揪心,各種查網站、大致把坑都寫了出來:1、在Linux下的mysql語句中,mysql> select host,user,authentication_string…

緩沖文件系統(fopen/fread/fwrite)和非緩沖文件系統(open/read/write)

open:系統調用,返回的是文件描述符,即文件句柄,是文件在文件描述副表里的索引。 fopen:C語言庫函數,返回的是一個指向文件結構的指針。fopen是ANSI C標準中的C語言庫函數,在不同的操作系統中應…

java 繼承示例_Java中的繼承類型以及示例

java 繼承示例Prerequisite: Inheritance and its implementation in Java 先決條件: 繼承及其在Java中的實現 Java中的繼承類型 (Type of inheritance in Java) In Java programming, there are following types of the inheritances, 在Java編程中,有…