當使用Netty,我很驚訝,如果我使用reuseAddress選項,它可以讓一個ServerSocket綁定到相同的地址不會引發「已經綁定異常」ServerSocket reuseAddress是否允許綁定到已經綁定的端口?
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(Executors
.newCachedThreadPool(), Executors.newCachedThreadPool()));
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline p = pipeline();
p.addLast("handler", new DummyHandler());
return p;
}
});
bootstrap.setOption("reuseAddress", true);
bootstrap.bind(new InetSocketAddress(2000));
bootstrap.bind(new InetSocketAddress(2000));
我只是想,reuseAddress允許新的socket重用一個close-wait套接字,但這是不同的。以下是netstat命令的結果
C:\Users\secmask>netstat -a -n|grep 2000
TCP 0.0.0.0:2000 0.0.0.0:0 LISTENING
TCP 0.0.0.0:2000 0.0.0.0:0 LISTENING
我錯過了什麼嗎?這是怎麼回事?
當新的收入客戶端連接到此端口時,哪個重複的套接字將接受客戶端?你能提供一些文件,有關這方面的鏈接嗎? – secmask 2011-02-19 04:25:44
當多個套接字同時綁定到同一個IP /端口時,它們的行爲是不確定的。任何事情都可能發生。沒有辦法預測它。正是出於這個原因,這是非常糟糕的做法。 `````````````````````````````````````````````只有在綁定自己的套接字後才能使用`reuseAddress`,然後關閉它並且需要在舊套接字完成任何等待狀態之前重新打開一個新套接字的IP /到達舊插座。 – 2011-02-22 08:37:00