JavaNIO2について。
クライアントのリクエストをリッスンするために次のものがあるとします...
asyncServerSocketChannel.accept(null, new CompletionHandler <AsynchronousSocketChannel, Object>() {
@Override
public void completed(final AsynchronousSocketChannel asyncSocketChannel, Object attachment) {
// Put the execution of the Completeion handler on another thread so that
// we don't block another channel being accepted.
executer.submit(new Runnable() {
public void run() {
handle(asyncSocketChannel);
}
});
// call another.
asyncServerSocketChannel.accept(null, this);
}
@Override
public void failed(Throwable exc, Object attachment) {
// TODO Auto-generated method stub
}
});
このコードは、クライアント接続プロセスを受け入れてから、別のコードを受け入れます。サーバーと通信するために、クライアントはAsyncSocketChannelを開き、メッセージを起動します。次に、完了ハンドラのcompleted()メソッドが呼び出されます。
ただし、これは、クライアントが同じAsyncSocketインスタンスで別のメッセージを送信したい場合は送信できないことを意味します。
別のAsycnSocketインスタンスを作成する必要があります。これは別のTCP接続を意味すると思いますが、これはパフォーマンスに影響します。
これを回避する方法はありますか?
または、別の言い方をすれば、同じasyncSocketChannelに複数のCompleteionHandlercompleted()イベントを受信させる方法はありますか?
編集:私の処理コードはこのようなものです...
public void handle(AsynchronousSocketChannel asyncSocketChannel) {
ByteBuffer readBuffer = ByteBuffer.allocate(100);
try {
// read a message from the client, timeout after 10 seconds
Future<Integer> futureReadResult = asyncSocketChannel.read(readBuffer);
futureReadResult.get(10, TimeUnit.SECONDS);
String receivedMessage = new String(readBuffer.array());
// some logic based on the message here...
// after the logic is a return message to client
ByteBuffer returnMessage = ByteBuffer.wrap((RESPONSE_FINISHED_REQUEST + " " + client
+ ", " + RESPONSE_COUNTER_EQUALS + value).getBytes());
Future<Integer> futureWriteResult = asyncSocketChannel.write(returnMessage);
futureWriteResult.get(10, TimeUnit.SECONDS);
} ...
これで、サーバーは非同期チャネルからメッセージを読み取り、応答を返します。クライアントは、答えが得られるまでブロックします。しかし、これは大丈夫です。クライアントがブロックしてもかまいません。
これが終了すると、クライアントは同じ非同期チャネルで別のメッセージを送信しようとしますが、機能しません。