2

イベントベースの接続ソケットを使用しようとしている小さなサーバーセットアップがあり、着信接続ごとにハンドラーが呼び出されます。最初の接続では問題なく機能しますが、最初の接続以降は新しい接続は受け入れられません。

簡単にするために、クライアント接続が入ってきたら閉じます。また、はい、サーバーは最初の接続後も実行されており、終了しません。

コードは次のとおりです。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


public class ServerTest
{
static CompletionHandler<AsynchronousSocketChannel, Object> handler =
        new CompletionHandler<AsynchronousSocketChannel, Object>() {
        @Override
        public void completed(AsynchronousSocketChannel result, Object attachment) {
            System.out.println(attachment + " completed with " + result + " bytes written");
            try {
                result.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void failed(Throwable e, Object attachment) {
            System.err.println(attachment + " failed with:");
            e.printStackTrace();
        }
    };

public static void main(String[] args) throws Exception
{
    AsynchronousChannelGroup group = AsynchronousChannelGroup.withThreadPool(Executors.newSingleThreadExecutor());
    System.out.println("STARTING");
    AsynchronousServerSocketChannel ssc =
        AsynchronousServerSocketChannel.open(group).bind(new InetSocketAddress("localhost", 9999));

    System.out.println("BOUND");
    ssc.accept(ssc, handler);

    group.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);

}
}
4

1 に答える 1