0

Java AsynchronousServerSocketChannel をテストしていますが、SO_KEEPALIVE=true を設定しようとすると、サポートされていないというエラー メッセージが表示されました。以下の問題を修正するにはどうすればよいですか? 本当にubunutサーバーでキープアライブをサポートしていませんか?

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

private void init(String host, int port) {
    try {
        final AsynchronousChannelGroup group = AsynchronousChannelGroup.withCachedThreadPool(Executors.newCachedThreadPool(), 10);
        final AsynchronousServerSocketChannel server = AsynchronousServerSocketChannel
                .open(group).bind(new InetSocketAddress(host, port))
                .setOption(StandardSocketOptions.SO_KEEPALIVE, true)
                .setOption(StandardSocketOptions.TCP_NODELAY, true)
                .setOption(StandardSocketOptions.SO_REUSEADDR, true)
                .setOption(StandardSocketOptions.SO_RCVBUF, 16 * 1024);
        System.out.println("Listening on: " + host + ":" + port);
        System.out.println("Channel Provider : " + server.provider());
        server.accept(null, new handler());
        group.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
        //TimeUnit.DAYS.sleep(Long.MAX_VALUE);
    } catch (IOException | InterruptedException ex) {
        Logger.getLogger(AIOEchoServer.class.getName()).log(Level.SEVERE, null, ex);
    }
}

private class handler implements CompletionHandler<AsynchronousSocketChannel, Void> {

    @Override
    public void completed(AsynchronousSocketChannel result, Void attachment) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public void failed(Throwable ex, Void attachment) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

エラーは次のとおりです。

Exception in thread "main" java.lang.UnsupportedOperationException: 'SO_KEEPALIVE' not supported
at sun.nio.ch.AsynchronousServerSocketChannelImpl.setOption(AsynchronousServerSocketChannelImpl.java:187)
at TestAIO.AIOEchoServer.init(AIOEchoServer.java:28)
at TestAIO.AIOEchoServer.main(AIOEchoServer.java:20)
4

1 に答える 1

2

Asynchronous Server SocketChannel を使用しています。つまり、新しい着信接続のみを受け入れ、データを交換できないリッスン ソケットです。socket オプションは、listen ソケットには適用できません。

クラスのドキュメントには、多くのことが記載されています。

取得した新しいソケットでこれらのオプションを設定する必要がありますaccept()

于 2016-06-25T12:50:21.040 に答える