mina-ibmの紹介

10155 ワード

http://www.ibm.com/developerworks/cn/opensource/os-cn-apmina/
もう一つの詳細紹介記事:https://www.ibm.com/developerworks/cn/java/j-lo-mina2/#major4
 
Apache MINAは、Apacheがより新しいプロジェクトを組織しており、高性能で利用性の高いネットワークアプリケーションを開発するために非常に便利な枠組みを提供しています.現在発行されているMINAバージョンは、Java NIO技術に基づくTCP/UDPアプリケーションの開発、シリアル通信プログラム(最新のプレビュー版のみで提供される)をサポートしており、MINAがサポートする機能もさらに拡張されている.
現在、MINAを使用しているソフトウェアは、Apache Directory Project、Aync Web、AMQP(Advanced Message Queuing Protocol)、RED 5 Server(Macromedia Flash Media RTMP)、Object RADIUS、Openfireなどがあります.
本論文では、簡単な挨拶プログラムハローServerを通じて、MINAのインフラストラクチャを紹介しながら、MINAを使ったネットワークアプリケーションの開発を実証する.
環境の準備
まずオフィシャルサイトに最新のMINAバージョンをダウンロードします.アドレスはhttp://mina.apache.org/downloads.htmlです.ダウンロードする前にまずMINAの2つのバージョンを紹介します.1.0.xはJDK 1.4、1.1.xはJDK 1.5のバージョンに適しています.両方のコンパイル環境はJDK 1.5が必要です.JDK 1.5は非常に一般的です.ここでは1.1.5バージョンのMINAを使って、コンパイルと実行に必要なファイルはmina-core-1.1.5.jarです.MINAの依存パケットsf 4 jをダウンロードします.MINAはこの項目をログ情報の出力として使用していますが、MINA自体はこのパッケージを添付していませんので、http://www.slf4j.org/download.htmlアドレスにsf 4 jパケットをダウンロードしてください.sf 4 jプロジェクトの解凍後、多くのファイルがあります.本例ではsf 4 j-appi-1.4.3.jarとsf 4 j-simple-1.4.3.jarの2つのjarファイルだけが必要です.この二つのファイルがないと、例プログラムを起動する時、org/slaf 4 j/ロギングFactory類では見つけられなかったエラーを報告します.もちろんマシンには1.5または更新バージョンのJDKが必要です.最も便利なJava開発環境を選んでください.例えばEclipseやNetBensなど、より便利なコードとデバッグができます.私たちの最低要求は簡単なテキストエディタですが. 
ページの端に戻る
コード作成と実行
編集コードHello Server.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()));
        //  HelloServer
        acceptor.bind(new InetSocketAddress(PORT), new HelloHandler(), config);
        System.out.println("HelloServer started on port " + PORT);
	}
}

/**
 * HelloServer     
 * @author liudong
 */
class HelloHandler extends IoHandlerAdapter {
/**
 *          
 */
@Override
    public void exceptionCaught(IoSession ssn, Throwable cause) {
        cause.printStackTrace();
        ssn.close();
    }

/**
 *        
 */
@Override
public void sessionOpened(IoSession ssn) throws Exception {
    System.out.println("session open for " + ssn.getRemoteAddress());
	}

/**
 *         
 */
@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);
    }
}
コンパイル実行まず、各行のコードの具体的な意味を読んでみなくてもいいです.あなたの使いやすいコンパイラでHello Server.javaをコンパイルします.誤報があったら、先に述べた三つのjarファイルをクラスパスに追加したかどうか確認してください.もしすべて順調に続けばハローServerプログラムを起動できます.起動後のヒント:HelloServer started on port 8080 は起動成功を表しています.もし起動が失敗したら、問題は類が見つからなかったり、ポートが占有されていたりします.ポートが占有されたら、交換してください.修正します.  PORT 定数値をコンパイルして再起動します.
テストサーバコマンドラインのウィンドウを開けて、telnet local host 8080を入力してから、英語名或いは他のめちゃくちゃな文字を入力してから車に戻って起動したサービスプログラムの反応を見に行きます.私の反応は以下の通りです.
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 が開発したネットワークプログラムは既に実行されました.
 
ページの端に戻る
MINA基本類の説明
アーキテクチャを紹介する前に、いくつかのインターフェースを認識する:
IoAccepterは、ネットワークアプリケーションのサーバ端に相当します.
IoConnectorはクライアントに相当します.
IoSession現在のクライアントからサーバ端への接続例
IoHandler業務処理ロジック
IoFilterフィルタは、通信層インターフェースと業務層インターフェースを接続するために使用される.
 
ページの端に戻る
MINAの基礎構造
下の図は  MINA のアーキテクチャ図、
図1:MINAのアーキテクチャ図
图 1:MINA 的架构图
図中のモジュールチェーンでは、IoServiceはアプリケーションの入口であり、前のコードのIoAccepterに相当し、IoAccepterはIoServiceの拡張インターフェースである.IoServiceインターフェースは、複数のIoFilterを追加するために使用されてもよく、これらのIoFilterは、責任連鎖モードに適合し、IoProcessorスレッドによって起動される.IoAccepterは、ioServiceインターフェースに基づいて、ある通信ポートをバインディングし、バインディングをキャンセルするインターフェースを提供しています.上記の例では、IoAccepterをこのように使用しています.
IoAcceptor acceptor = new SocketAcceptor();
サービスとしてのソケット通信方式を使用したアクセスに相当し、現在バージョンのMINAは、SocketAccepter以外のデータ通信ベースのDatagramAccepterと、パイプベースのVmPipeAccepterを提供しています.また、シリアル通信接続方式も含まれており、現在はシリアル通信に基づくアクセス方式は最新のテスト版のMINAで提供されています.あなたも自分でIoServiceインターフェースを実現して自分の通信方式を使うことができます.
上の図の右端、つまりIoHandlerは業務処理モジュールです.前の例のハローHandler類に相当します.業務処理クラスでは、実際の通信詳細に関心を持たず、クライアントから送信された情報を処理すれば良い.Handlerクラスを編纂するということは、MINAを使ってネットワークアプリケーションを開発する重点があります.MINAがすべての通信方面の細かい問題を解決したことに相当します.Handlerクラスを簡略化するために、MINAはIoHandler Adapterクラスを提供しています.このような種類はIoHandlerインターフェースを実現しただけですが、何の処理もしません.
1つのIoHandlerインターフェースには、以下のようないくつかの方法(MINAからのAPI文書)がある.
 
void exception Cauht(IoSession) セッション cause)          インターフェース内の他の方法が例外を投げて捕獲されていない場合、この方法を起動します.
void message Received(IoSession) セッション メッセージ           この方法は、クライアントの要求情報を受信するとトリガされる.
void message Session セッション メッセージ           この方法は、情報がクライアントに転送されたときにトリガされます.
void session Closeed(IoSession) セッション)           接続が閉じられていると、クライアントプログラムが突然終了するなどのトリガが発生します.
void session Created(IoSession) セッション)           新しいクライアントが接続されると、この方法が起動されます.
void sessionIdle(IoSession) セッション status           接続が空きましたら、この方法を起動します.
void session Opened(IoSession) セッション)           接続後に開くと、この方法がトリガされます.この方法とsession Createdは同時にトリガされます.
前に述べたように、IoServiceは下の通信アクセスを担当していますが、IoHandlerは業務処理を担当しています.MINAアーキテクチャ図のIoFilterは何の用途ですか?答えはあなたがどんな用途でもいいです.しかし、一つの用途が必要です.それはIoServiceとIoHandlerの間の橋です.IoHandlerインターフェースの中で最も重要な方法はmessage Receivedであり、この方法の第二のパラメータはObject型のメッセージであり、全体的に周知の通り、ObjectはJavaオブジェクトのすべての基礎であり、誰がこのメッセージのタイプを決定しますか?答えはこのIoFilterの中にあります.前に使用した例では、クライアントから入力された情報を一行のテキストに変換してIoHandlerに渡すというIoFilterを追加しましたので、message Receivedで直接msgオブジェクトをStringオブジェクトに変換することができます.
もしフィルタを提供しないなら、message Received方法の第二のパラメータタイプはbyteのバッファエリアで、対応するクラスはorg.apache.mina.ByteBufferです.解析クライアント情報をIoHandlerにおいても良いですが、これは推奨されたやり方ではなく、元のクリアなモデルがぼやけてしまい、IoHandlerは業務処理だけでなく、プロトコル解析の任務としても役立ちます.
MINA自体は、ロギングFilter(ログ記録)、BlackListFilter(ブラックリストフィルタ)、CopressionFilter(圧縮)、SSLFilter(SSL暗号化)などの常用フィルタを持っている.
 
その他
MINAは、ネットワークサーバ端末アプリケーションを開発するだけでなく、IoConnectorを使って様々なネットワークサービスプログラムに接続することができます.
本論文のHelloServerの例を通して、MINAがどれほど便利であるかに驚きながら、その卓越した性能を誇りに思っています.MINAを使ったサーバプログラムの性能はC/C++言語を使ったネットワークサービスに近づいていると言われています.MINAの入門文章としては、性能問題は本論文では議論されていない.
また、MINA圧縮パッケージにはハローServerよりもはるかに良い例が多く添付されています.これらの例を通して、MINAをさらに理解し把握することができます.