我是套接字编程的小伙子。也许我在问一个基本问题。请多多包涵。 我写了一个示例netty服务器并从控制台启动它。它运行正常。我遇到的问题是,当我从两个控制台窗口运行相同的服务器时,我希望其中一个抛出'Address in in use'异常。它没有这样做,我不明白为什么。请帮忙。
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));
}
答案 0 :(得分:3)
总结上面的许多评论:
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