Linux でサーバー ソケットを使用しています。time_wait TCP ステータスが期限切れになる前に、それを閉じて再度開く必要があります。バインディングの前にサーバー ソケットの再利用アドレス オプションを設定しましたが、まだ BindException がスローされます。これも試しましたhttp://meteatamel.wordpress.com/2010/12/01/socket-reuseaddress-property-and-linux/しかし、それでも機能しません。
サーバーソケットを開くには、次を使用します。
ServerSocket ss = new ServerSocket();
ss.setReuseAddress(true);
ss.bind(new InetSocketAddress(12345));
そして閉じる:
ss.close();
バインド呼び出しで「アドレスは既に使用されています」BindException がスローされます。
このコードは例外を生成します:
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
final ServerSocket ss = new ServerSocket();
ss.setReuseAddress(true);
ss.bind(new InetSocketAddress(12345));
Socket s = ss.accept();
System.out.println((char) s.getInputStream().read());
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
Thread.sleep(500);
Socket s = new Socket("localhost", 12345);
s.getOutputStream().write('c');
}