
この記事では、このライブラリを使用して単純なサーバーを作成するプロセスについて説明します。
何を書いていますか?
この記事では、telnetを使用して接続できる最も単純なサーバーを作成します。 接続すると、サーバーはクライアントに挨拶し、 timeコマンドでは接続から経過した秒数を伝え、 qコマンドでは別れを告げて接続を閉じます。
それでは始めましょう。
プロジェクトへの接続
メインのmina-coreライブラリに加えて、 slf4j(Java用のシンプルロギングファサード)ライブラリも接続する必要があります。MINAは、Apache log4jなどのさまざまなロギングシステムへのインターフェースとして使用します。 Connectにはslf4j-apiとロギング実装の1つが必要です 。 この例では、ロギングは使用されないため、 slf4j-nopを使用できます。
エントリポイントとIoAcceptor
メインアプリケーションメソッドでは、 IoAcceptorを作成して構成する必要があります。これは、着信接続を受け入れるオブジェクトです。 次のメソッドが必要になります( IoAcceptorはIoServiceインターフェイスを拡張し、いくつかのメソッドが宣言されています)。
-いわゆる「フィルターチェーン」を返します。DefaultIoFilterChainBuilder getFilterChain()
void setHandler(IoHandler handler)
void bind(SocketAddress localAddress)
この例では、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インターフェイスの実装です。
void sessionCreated(IoSession session)
void sessionOpened(IoSession session)
void sessionClosed(IoSession session)
void sessionIdle(IoSession session, IdleStatus status)
void messageReceived(IoSession session, Object message)
void messageSent(IoSession session, Object message)
void exceptionCaught(IoSession session, Throwable cause)
この例では、 sessionOpenedとmessageReceivedの 2つだけを実装すれば十分なので、インターフェイスを直接実装する代わりに、インターフェイスの空の実装であるIoHandlerAdapterクラスを拡張し、必要なメソッドをオーバーライドできます。
IoSessionオブジェクトはセッション表現です(接続でもあります)。 そのメソッドのいくつかが必要になります。
WriteFuture write(Object message)
CloseFuture close(boolean immediately)
IoSessionでは、接続に関連するデータを保存することもできます。この機会を利用して、接続時間を節約します。 これを行うには、2つの方法を使用します。
Object setAttribute(Object key, Object value)
Object getAttribute(Object key)
したがって、ハンドラーを作成できるようになりました。
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.
完全なソースコードはこちらからダウンロードできます 。
読んでくれてありがとう!