7

私はソケット プログラミングの初心者です。基本的な質問をしているのかもしれません。我慢してください。サンプルの netty サーバーを作成し、コンソールから起動しました。それはうまくいきます。私が抱えている問題は、2 つのコンソール ウィンドウから同じサーバーを実行すると、そのうちの 1 つが「アドレスは既に使用されています」という例外をスローすると予想されることです。それはそれをしません、そして私はその理由を理解していません。助けてください。

    public static void main(String[] args) {
    ChannelFactory cf = new NioServerSocketChannelFactory(Executors.newFixedThreadPool(100), new MemoryAwareThreadPoolExecutor(1000,2048,25096,2,TimeUnit.SECONDS));
    //ChannelFactory cf = new OioServerSocketChannelFactory(Executors.newFixedThreadPool(100), Executors.newCachedThreadPool());


    ServerBootstrap bootstrap = new ServerBootstrap(cf);
    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(new ChannelHandler("test"));
        }
    });

    bootstrap.setOption("child.keepAlive", true);
    bootstrap.setOption("child.tcpNoDelay", true);      
    bootstrap.setOption("child.reuseAddress", true);
    bootstrap.setOption("child.connectTimeoutMillis", 30000);
    //NEVER bootstrap.setOption("child.readWriteFair", true);
    //bootstrap.setOption("disconnect", true);
    bootstrap.setOption("tcpNoDelay", true);
    bootstrap.setOption("reuseAddress", true);
    bootstrap.setOption("connectTimeoutMillis", 30000);
    bootstrap.setOption("readWriteFair", true);
    bootstrap.bind(new InetSocketAddress(9998));        
}
4

1 に答える 1

4

上記の多くのコメントを要約すると:

このbootstrap.setOption("reuseAddress", true);オプションは、既にバインドされているip:port組み合わせへのバインドを許可します。これは通常、サーバーがクラッシュしたり強制終了されたりした場合にサーバーを再起動できるようにするために使用されます (つまり、ソケットがまだTIME_WAIT状態にある間)。

Windows では、まったく異なる 2 つのプログラムをまったく同じ .xml ファイルにバインドすることができますip:port。そのため、アプリ内にある場合bootstrap.setOption("reuseAddress", false);でも、別のアプリ (悪意のあるアプリ)SO_REUSEADDRip:port.

詳細については、http: //msdn.microsoft.com/en-us/library/windows/desktop/ms740621 (v=vs.85).aspx を参照してください。

于 2012-09-05T21:56:33.960 に答える