Apache MINAを使用した単純なサーバーの作成

アパッチミナ Apache MINAは、Javaでクライアントサーバーアプリケーションを作成するためのオープンソースライブラリです。 現在の最新バージョン-2.0.4-は2011年6月14日にリリースされました。



この記事では、このライブラリを使用して単純なサーバーを作成するプロセスについて説明します。





何を書いていますか?



この記事では、telnetを使用して接続できる最も単純なサーバーを作成します。 接続すると、サーバーはクライアントに挨拶し、 timeコマンドでは接続から経過した秒数を伝え、 qコマンドでは別れを告げて接続を閉じます。



それでは始めましょう。



プロジェクトへの接続



メインのmina-coreライブラリに加えて、 slf4j(Java用のシンプルロギングファサード)ライブラリも接続する必要があります。MINAは、Apache log4jなどのさまざまなロギングシステムへのインターフェースとして使用します。 Connectにはslf4j-apiとロギング実装の1つが必要です 。 この例では、ロギングは使用されないため、 slf4j-nopを使用できます。



エントリポイントとIoAcceptor



メインアプリケーションメソッドでは、 IoAcceptorを作成して構成する必要があります。これは、着信接続を受け入れるオブジェクトです。 次のメソッドが必要になります( IoAcceptorIoServiceインターフェイスを拡張し、いくつかのメソッドが宣言されています)。



この例では、TCP / IP用のIoAcceptorの実装であるNioSocketAcceptor適しています。



フィルターチェーンとプロトコル



ハンドラーに入る前に、すべてのイベント(接続の受け入れ、データの受信など)は、いわゆる「フィルターチェーン」を通過します。 フィルターは、ハンドラー内にある可能性のあるすべてのアクションを実行できますが、そこではあまり適切ではありません-ロギングなど



個別に検討する価値のあるフィルターの1つはProtocolCodecFilterです。 このフィルタの目的は、特定のオブジェクトのデータを送信中に一連のバイトに変換し、受信時に一連のバイトから装飾されたオブジェクトに変換することです。 フィルターコンストラクターの1つは次のようになります。

 ProtocolCodecFilter(ProtocolCodecFactory factory)
      
      





この記事では、独自の「ファクトリー」の作成については触れません。この例では、MINAで最もシンプルで既に実装されているプロトコルの1つが適切です-TextLine(「factory」 -TextLineCodecFactory )は、バイトのシーケンスをストリング( String 。 さらに、文字列に送信する場合、ラインターミネータが追加され、受信時に、同じラインターミネータが受信された場合にのみ、ラインが「フィルタチェーン」に沿って、またはハンドラに送信されます。 エンコーディングと行末文字は、コンストラクタで指定できます。

 TextLineCodecFactory(Charset charset, String encodingDelimiter, String decodingDelimiter)
      
      





したがって、ハンドラーは装飾されたオブジェクト、この場合は文字列( String )を処理する必要があります。



DefaultIoFilterChainBuilderオブジェクトにはフィルターを追加するためのメソッドがいくつかありますが、必要なのは1つだけです。

 void addLast(String name, IoFilter filter)
      
      





このメソッドは、チェーンの最後にフィルターを追加します。



これで、 mainメソッドを作成できます。

 public static void main(String[] args) throws IOException { IoAcceptor acceptor = new NioSocketAcceptor(); acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.defaultCharset(), System.lineSeparator(), System.lineSeparator()))); acceptor.setHandler(new MyMinaServerHandler()); acceptor.bind(new InetSocketAddress(12345)); }
      
      







ハンドラー、IoHandlerおよびIoSession



ハンドラーは、次のメソッドを含むIoHandlerインターフェイスの実装です。



この例では、 sessionOpenedmessageReceivedの 2つだけを実装すれば十分なので、インターフェイスを直接実装する代わりに、インターフェイスの空の実装であるIoHandlerAdapterクラスを拡張し、必要なメソッドをオーバーライドできます。



IoSessionオブジェクトはセッション表現です(接続でもあります)。 そのメソッドのいくつかが必要になります。



IoSessionでは、接続に関連するデータを保存することもできます。この機会を利用して、接続時間を節約します。 これを行うには、2つの方法を使用します。





したがって、ハンドラーを作成できるようになりました。

 public class MyMinaServerHandler extends IoHandlerAdapter { public void sessionOpened(IoSession session) { session.setAttribute("time", System.currentTimeMillis()); session.write("Hello!"); } public void messageReceived(IoSession session, Object message) { switch (((String) message).trim()) { case "time": session.write(String.format("You connected %d seconds ago", (System.currentTimeMillis() - (Long) session.getAttribute("time")) / 1000)); break; case "q": session.write("Bye!"); session.close(false); break; } } }
      
      







それだけです



新たにアセンブルされたサーバーを実行し、コマンドラインまたはターミナルに書き込みます。

 telnet localhost 12345
      
      





サーバーはコマンドに応答します。

 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hello! time You connected 11 seconds ago q Bye! Connection closed by foreign host.
      
      







完全なソースコードはこちらからダウンロードできます

読んでくれてありがとう!



All Articles