日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用 Apache MINA 开发高性能网络应用程序

發(fā)布時間:2024/4/17 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Apache MINA 开发高性能网络应用程序 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://www.ibm.com/developerworks/cn/opensource/os-cn-apmina/

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 組織一個較新的項目,它為開發(fā)高性能和高可用性的網(wǎng)絡(luò)應(yīng)用程序提供了非常便利的框架。當(dāng)前發(fā)行的 MINA 版本支持基于 Java NIO 技術(shù)的 TCP/UDP 應(yīng)用程序開發(fā)、串口通訊程序(只在最新的預(yù)覽版中提供),MINA 所支持的功能也在進(jìn)一步的擴(kuò)展中。

目前正在使用 MINA 的軟件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。

本文將通過一個簡單的問候程序 HelloServer 來介紹 MINA 的基礎(chǔ)架構(gòu)的同時演示如何使用MINA 開發(fā)網(wǎng)絡(luò)應(yīng)用程序。

環(huán)境準(zhǔn)備

  • 首先到官方網(wǎng)站下載最新的 MINA 版本,地址是:http://mina.apache.org/downloads.html。下載之前先介紹一下 MINA 的兩個版本:1.0.x 適合運行環(huán)境為 JDK1.4,1.1.x 適合 JDK1.5 的版本,兩者的編譯環(huán)境都需要 JDK1.5。JDK1.5 已經(jīng)是非常普遍了,本文中使用 1.1.5 版本的 MINA,編譯和運行所需的文件是 mina-core-1.1.5.jar。
  • 下載 MINA 的依賴包 slf4j。MINA 使用此項目作為日志信息的輸出,而 MINA 本身并不附帶此項目包,請到http://www.slf4j.org/download.html 地址下載 slf4j 包,slf4j 項目解壓后有很多的文件,本例中只需要其中的 slf4j-api-1.4.3.jar 和 slf4j-simple-1.4.3.jar 這兩個 jar 文件。如果沒有這兩個文件就會導(dǎo)致啟動例子程序的時候報 org/slf4j/LoggerFactory 類沒找到的錯誤。
  • 當(dāng)然要求機(jī)器上必須裝有 1.5 或者更新版本的 JDK。
  • 最好你應(yīng)該選擇一個順手的 Java 開發(fā)環(huán)境例如 Eclipse 或者 NetBeans 之類的,可以更方便的編碼和調(diào)試,雖然我們的最低要求只是一個簡單的文本編輯器而已。

  • 編寫代碼并執(zhí)行

  • 編寫代碼 HelloServer.java 如下
  • package demo.mina.echo;import java.io.IOException; import java.net.InetSocketAddress;import org.apache.mina.common.*; import org.apache.mina.transport.socket.nio.*; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory;/*** HelloServer演示程序* @author liudong (http://www.dlog.cn/javayou)*/ public class HelloServer {private static final int PORT = 8080; /*** @param args* @throws IOException */ public static void main(String[] args) throws IOException {IoAcceptor acceptor = new SocketAcceptor(); IoAcceptorConfig config = new SocketAcceptorConfig();DefaultIoFilterChainBuilder chain = config.getFilterChain();//使用字符串編碼chain.addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory()));//啟動HelloServeracceptor.bind(new InetSocketAddress(PORT), new HelloHandler(), config);System.out.println("HelloServer started on port " + PORT);} }/*** HelloServer的處理邏輯* @author liudong*/ class HelloHandler extends IoHandlerAdapter { /*** 當(dāng)有異常發(fā)生時觸發(fā)*/ @Overridepublic void exceptionCaught(IoSession ssn, Throwable cause) {cause.printStackTrace();ssn.close();}/*** 有新連接時觸發(fā)*/ @Override public void sessionOpened(IoSession ssn) throws Exception {System.out.println("session open for " + ssn.getRemoteAddress());}/*** 連接被關(guān)閉時觸發(fā)*/ @Override public void sessionClosed(IoSession ssn) throws Exception {System.out.println("session closed from " + ssn.getRemoteAddress());}/*** 收到來自客戶端的消息*/ public void messageReceived(IoSession ssn, Object msg) throws Exception { String ip = ssn.getRemoteAddress().toString(); System.out.println("===> Message From " + ip +" : " + msg); ssn.write("Hello " + msg);} }

  • 編譯執(zhí)行
  • 先不用試著去讀懂每一行代碼的具體意思,用你順手的編譯器編譯 HelloServer.java,如果報錯請確認(rèn)是否已將前面提到的三個 jar 文件添加至類路徑中。如果一切順利接著就可以啟動HelloServer 程序,啟動后提示:HelloServer started on port 8080 表示啟動成功,如果啟動失敗,問題無外乎是類沒找到或者端口占用。如果端口被占用的話,換一個羅,修改 PORT 常量值后再次編譯并啟動。

  • 測試服務(wù)器
  • 打開命令行窗口,輸入 telnet localhost 8080 后,輸入您的英文名或者其他一些亂七八糟的字符后回車再去看看剛啟動的服務(wù)程序有何反應(yīng)。我的反應(yīng)如下:

    HelloServer started on port 8080 session open for /127.0.0.1:3023 ===> Message From /127.0.0.1:3023 :hello ===> Message From /127.0.0.1:3023 :hello ===> Message From /127.0.0.1:3023 :liudong ===> Message From /127.0.0.1:3023 :Winter Lau

    好了,一切正常,恭喜你的第一個使用 MINA 開發(fā)的網(wǎng)絡(luò)程序已經(jīng)成功運行了。


    MINA 基本類的描述

    在介紹架構(gòu)之前先認(rèn)識幾個接口:

    IoAccepter 相當(dāng)于網(wǎng)絡(luò)應(yīng)用程序中的服務(wù)器端

    IoConnector 相當(dāng)于客戶端

    IoSession 當(dāng)前客戶端到服務(wù)器端的一個連接實例

    IoHandler 業(yè)務(wù)處理邏輯

    IoFilter 過濾器用于懸接通訊層接口與業(yè)務(wù)層接口


    MINA 的基礎(chǔ)架構(gòu)

    下圖是 MINA 的架構(gòu)圖,


    圖 1:MINA 的架構(gòu)圖

    在圖中的模塊鏈中,IoService 便是應(yīng)用程序的入口,相當(dāng)于我們前面代碼中的 IoAccepter,IoAccepter 便是 IoService 的一個擴(kuò)展接口。IoService 接口可以用來添加多個 IoFilter,這些 IoFilter 符合責(zé)任鏈模式并由 IoProcessor 線程負(fù)責(zé)調(diào)用。而 IoAccepter 在 ioService 接口的基礎(chǔ)上還提供綁定某個通訊端口以及取消綁定的接口。在上面的例子中,我們是這樣使用 IoAccepter 的:

    IoAcceptor acceptor = new SocketAcceptor();

    相當(dāng)于我們使用了 Socket 通訊方式作為服務(wù)的接入,當(dāng)前版本的 MINA 還提供了除 SocketAccepter 外的基于數(shù)據(jù)報文通訊的 DatagramAccepter 以及基于管道通訊的 VmPipeAccepter。另外還包括串口通訊接入方式,目前基于串口通訊的接入方式已經(jīng)在最新測試版的 MINA 中提供。你也可以自行實現(xiàn) IoService 接口來使用自己的通訊方式。

    而在上圖中最右端也就是 IoHandler,這便是業(yè)務(wù)處理模塊。相當(dāng)于前面例子中的 HelloHandler 類。在業(yè)務(wù)處理類中不需要去關(guān)心實際的通訊細(xì)節(jié),只管處理客戶端傳輸過來的信息即可。編寫 Handler 類就是使用 MINA 開發(fā)網(wǎng)絡(luò)應(yīng)用程序的重心所在,相當(dāng)于 MINA 已經(jīng)幫你處理了所有的通訊方面的細(xì)節(jié)問題。為了簡化 Handler 類,MINA 提供了 IoHandlerAdapter 類,此類僅僅是實現(xiàn)了 IoHandler 接口,但并不做任何處理。

    一個 IoHandler 接口中具有如下一些方法(摘自 MINA 的 API 文檔):

    void exceptionCaught(IoSession?session, Throwable?cause)
    ? ? ? ? ? ? ? ? ? ?當(dāng)接口中其他方法拋出異常未被捕獲時觸發(fā)此方法
    void messageReceived(IoSession?session, Object?message)
    ? ? ? ? ? ? ? ? ? ?當(dāng)接收到客戶端的請求信息后觸發(fā)此方法.
    void messageSent(IoSession?session, Object?message)
    ? ? ? ? ? ? ? ? ? ?當(dāng)信息已經(jīng)傳送給客戶端后觸發(fā)此方法.
    void sessionClosed(IoSession?session)
    ? ? ? ? ? ? ? ? ? ?當(dāng)連接被關(guān)閉時觸發(fā),例如客戶端程序意外退出等等.
    void sessionCreated(IoSession?session)
    ? ? ? ? ? ? ? ? ? ?當(dāng)一個新客戶端連接后觸發(fā)此方法.
    void sessionIdle(IoSession?session, IdleStatus?status)
    ? ? ? ? ? ? ? ? ? ?當(dāng)連接空閑時觸發(fā)此方法.
    void sessionOpened(IoSession?session)
    ? ? ? ? ? ? ? ? ? ?當(dāng)連接后打開時觸發(fā)此方法,一般此方法與 sessionCreated 會被同時觸發(fā)

    前面我們提到 IoService 是負(fù)責(zé)底層通訊接入,而 IoHandler 是負(fù)責(zé)業(yè)務(wù)處理的。那么 MINA 架構(gòu)圖中的 IoFilter 作何用途呢?答案是你想作何用途都可以。但是有一個用途卻是必須的,那就是作為 IoService 和 IoHandler 之間的橋梁。IoHandler 接口中最重要的一個方法是 messageReceived,這個方法的第二個參數(shù)是一個 Object 型的消息,總所周知,Object 是所有 Java 對象的基礎(chǔ),那到底誰來決定這個消息到底是什么類型呢?答案也就在這個 IoFilter 中。在前面使用的例子中,我們添加了一個 IoFilter 是 new ProtocolCodecFilter(new TextLineCodecFactory()),這個過濾器的作用是將來自客戶端輸入的信息轉(zhuǎn)換成一行行的文本后傳遞給 IoHandler,因此我們可以在 messageReceived 中直接將 msg 對象強(qiáng)制轉(zhuǎn)換成 String 對象。

    而如果我們不提供任何過濾器的話,那么在 messageReceived 方法中的第二個參數(shù)類型就是一個 byte 的緩沖區(qū),對應(yīng)的類是 org.apache.mina.common.ByteBuffer。雖然你也可以將解析客戶端信息放在 IoHandler 中來做,但這并不是推薦的做法,使原來清晰的模型又模糊起來,變得 IoHandler 不只是業(yè)務(wù)處理,還得充當(dāng)協(xié)議解析的任務(wù)。

    MINA自身帶有一些常用的過濾器,例如LoggingFilter(日志記錄)、BlackListFilter(黑名單過濾)、CompressionFilter(壓縮)、SSLFilter(SSL加密)等。


    其他

    MINA 不僅僅是用來開發(fā)網(wǎng)絡(luò)服務(wù)器端應(yīng)用程序,它一樣可以使用 IoConnector 來連接到各種各樣的網(wǎng)絡(luò)服務(wù)程序。

    通過本文中 HelloServer 這個例子,我們在驚嘆 MINA 可以帶來多么大便利的同時,還不得不為其卓越的性能而驕傲,據(jù)稱使用MINA開發(fā)服務(wù)器程序的性能已經(jīng)逼近使用 C/C++ 語言開發(fā)的網(wǎng)絡(luò)服務(wù)。作為 MINA 的入門文章,性能問題不在本文討論范圍內(nèi)。

    另外在 MINA 壓縮包中附帶有不少比 HelloServer 要好得多的例子,通過這些例子可以進(jìn)一步的了解并掌握 MINA。


    參考資料

    • http://mina.apache.org MINA 官方網(wǎng)站

    • http://mina.apache.org/features.html 您可以在這里查看關(guān)于 MINA 的更多特性

    • http://mina.apache.org/testimonials.html 看看別人是如何評價 MINA 的 http://asyncweb.safehaus.org/使用 MINA 開發(fā)的高性能 WEB 服務(wù)器

    關(guān)于作者

    劉冬,一直使用 J2EE/J2ME 從事移動互聯(lián)網(wǎng)方面的開發(fā)。您可以通過 Java 自由人網(wǎng)站來跟他聯(lián)系,網(wǎng)址是:http://www.dlog.cn/javayou ,另外他的郵件地址是javayou@gmail.com。

    總結(jié)

    以上是生活随笔為你收集整理的使用 Apache MINA 开发高性能网络应用程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。