Apache MINAを使ってみよう - Apache MINAで簡易なサーバ作成

2009/03/05 17:59Update
TAGS: Apache | MINA | サーバ | IoAcceptor | SocketAcceptor | SocketAcceptorConfig | サンプル

Apache MINAはNIOベースのオープンソース・ネットワークアプリケーションフレームワークです。Apache MINAを利用すれば、高いパフォーマンスとスケーラブリティを持つネットワーク・アプリケーションを簡単に作成できます。本文はApache MINAを利用して、簡単なサーバサイドのアプリケーションを作成してみようと思います。

Apache MINAについて
――――――――――――――――――――――――
Apache MINA - ネットワークアプリケーションフレームワーク
――――――――――――――――――――――――
Apache MINAダウンロード 
今回は
Apache MINA 1.1.7 stable (Java 5+)
をダウンロードします。

Apache MINAを利用するのに、SLF4Jというログライブラリを別途ダウンロードする必要があります。
SLF4Jについて
――――――――――――――――――――――――
SLF4J - Log4jやLogbackなどのログライブラリ・ラッパー
――――――――――――――――――――――――

SLF4Jログ・ライブラリのダウンロード

ダウンロードしたそれぞれのファイルを解凍し、中にある

mina-core-x.y.z.jar
slf4j-api-x.y.z.jar
slf4j-simple-x.y.z.jar

3つのファイルをclasspathに通してください。
※x.y.zはそれぞれのバージョン番号になります。
※SLF4Jログシステムについて、今回はslf4j-simple-x.y.z.jarを利用します。

では、早速次のサンプルコードを見てみましょう。

Apache MINAサンプル


TestApacheMinaMyServer.java
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;

/**
 * ApacheMina使ったみよう。サンプル
 */
public class TestApacheMinaMyServer {
    private static final int PORT = 8080;

    /**
     * 
     */
    public static void main(String[] args) throws IOException {
        //1)SocketAcceptorでIoAcceptor生成(サーバサイド)
        IoAcceptor acceptor = new SocketAcceptor();
        
        //2)設定
        IoAcceptorConfig config = new SocketAcceptorConfig();
        DefaultIoFilterChainBuilder chain = config.getFilterChain();
        // テキスト・codec
        chain.addLast("codec", new ProtocolCodecFilter(
                new TextLineCodecFactory()));
        
        //3)ApacheMinaMyServer起動
        acceptor.bind(new InetSocketAddress(PORT), new MyHandler(), config);
        System.out.println("ApacheMinaServer started on port " + PORT);
    }
}

/**
 * 処理用Handlerクラス
 */
class MyHandler 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);
    }
}


解説:
ソースの中にも書かれたように、Apache MINAを利用してサーバサイドのアプリケーション開発はすごく簡単です。
1)SocketAcceptorでIoAcceptor生成(サーバサイド)
    IoAcceptor acceptor = new SocketAcceptor();
2)設定
    IoAcceptorConfig config = new SocketAcceptorConfig();
    ..
3)ApacheMinaMyServer起動
    acceptor.bind(new InetSocketAddress(PORT), new MyHandler(), config);

4)IoHandlerAdapterを継承したクラスを定義
  このクラスは何らかのイベント(異常、新規接続、接続クローズ、メッセージなど)があった時呼び出されます。


実行
1)、このアプリケーションを実行します。
javac TestApacheMinaMyServer.java
java TestApacheMinaMyServer
ApacheMinaServer started on port 8080
ポート8080に待っているよっというメッセージが出力しています。

2)クライアントから接続します。
telnet localhost 8080
で8080ポートにtelnetし、適当なメッセージを入力してみると、コンソールに次のようなメッセージが表示されます。
java TestApacheMinaMyServer
ApacheMinaServer started on port 8080
session open for /127.0.0.1:2679
===> Message From /127.0.0.1:2679 : hello
===> Message From /127.0.0.1:2679 : test
session closed from /127.0.0.1:2679

参考資料


Apache MINA - ネットワークアプリケーションフレームワーク
SLF4J - Log4jやLogbackなどのログライブラリ・ラッパー

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments

用户名 (required)

Email (will not be published) (required)

URL

Evaluation