7

我是套接字编程的菜鸟。也许我在问一个基本问题。请多多包涵。我编写了一个示例 netty 服务器并从控制台启动它。它运行良好。我遇到的问题是,当我从两个控制台窗口运行同一服务器时,我希望其中一个会抛出“地址已在使用”异常。它不这样做,我不明白为什么。请帮忙。

    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 中,可能有两个完全不同的程序绑定完全相同的ip:port. 因此,即使在您的应用程序中,您bootstrap.setOption("reuseAddress", false);仍然有可能让另一个应用程序(即恶意)SO_REUSEADDR成功绑定到您的ip:port.

有关更多详细信息,请参见此处:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms740621 (v=vs.85).aspx

于 2012-09-05T21:56:33.960 回答