Netty允许同一个端口被不同的程序绑定多次

我是套接字编程的noob,可能是在问一个基本的问题。 请多多包涵。 我编写了一个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));        
}

总结上面的许多评论:

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

链接地址: http://www.djcxy.com/p/11113.html

上一篇: Netty allows same port to be bound multiple times by different programs

下一篇: Adding a Quiz Timer, Fade Out/Skip to the next if timer reaches 0