2009-04-20 12 views
8

Javaアプリケーションの1つでソケット通信を使用しています。プログラムが異常終了を検出した場合、リスニングポートは閉じず、「ポートはすでに開いています」というメッセージが表示されるため、プログラムを開始できません。 Doとにかくこの問題に対処していますか?この問題を処理する一般的な方法は何ですか?プログラム終了時にポートを閉じるにはどうすればよいですか?

答えて

22

あなたのプログラムはソケットでリッスンしているようです。通常、プログラムが終了すると、OSは開いているソケット(リスニングソケットを含む)をすべて閉じます。しかし、リスニングソケットの場合、OSはプログラムが終了してからしばらくの間(数分)ポートを予約して、未処理の接続試行を処理できるようにします。プログラムが異常終了した場合は、後でもう一度やり直してください。

この遅延時間を避けたい場合は、setsockopt()を使用してSO_REUSEADDRオプションを使用してソケットを構成できます。これは、OSに、同じアドレスを再利用することが問題ないことを知っていることを伝えます。この問題は発生しません。

このオプションは、ServerSocket.setReuseAddress(true)メソッドを使用してJavaで設定できます。

2

オペレーティングシステムは、JVMプロセスが終了したときに自動的にそのような処理を行う必要があります。ただし、ポートが閉じられるまでには少し時間がかかることがあります。

関連する問題