2011-10-20 10 views
5

私のアプリケーションでは、常に実行されていて、いくつかのポートを送信または受信するスレッドが1つあります。Javaコードでデータグラムソケットの再利用アドレスオプションを設定する方法は?

このアプリケーションはバックグラウンドで実行されます。ソケットを作成しているときに、以前同じスレッドが使用していたポートがソケットのclose()で解放されていないことが判明しました。だからこのようにしてみた

 dc = new DatagramSocket(inetAddr); 
     dc.setReuseAddress(true); 

問題は2行目にも届かないという問題です。最初の行自体で私はexpcetion BindException: Address already in useを得ています。

誰でもこの状況を処理する方法を手伝ってください。

ポートを解放する方法はありますか? &よろしく、
SSuman185

+0

は私の編集した答えを見てください。ありがとう。 – user370305

答えて

6

MulticastSocketを使用

感謝。それを引数なしで構築します。それは暗黙のうちにsetReuseAddress(true)を呼び出します。次にbind()を呼び出します。

現時点では、setReuseAddress()を呼び出すのが遅すぎて、何もできません。

+0

+1、あなたの答えを共有します。 – user370305

+0

私はこれを試しましたが、疑問がありましたか?私は、パラメータを使ってDatagramSocket()を作成すると、空きポート番号にバインドされることがわかりました。再使用アドレスとバインドを設定すると、新しいポートにバインドされます。古いポートはどうなりますか? – Suman

+0

@ SSuman185が正しく表示されます。 MulticastSocketを作成する必要があります。 DatagramSocketと同じことができます。そのデフォルトコンストラクタは約15年前に誤って設計されています。 – EJP

11

DatagramSocket(inetAddr)は、ポートにバインドします。バインドする前にsetReuseAddress(true)する必要があります。

dc = new DatagramSocket(null); 
dc.setReuseAddress(true); 
dc.bind(inetAddr); 

このコンストラクタは、結合していないポートを残します:

はこれを行うには...次を使用します。

+0

ここでinetAddrは? –

0

これは、それが私のために働いていた方法です:

try { 
     clientMulticastSocket = new MulticastSocket(null); 
     clientMulticastSocket.setReuseAddress(true); 
     clientMulticastSocket.bind(new InetSocketAddress(multicastHostAddress, multicastPort)); 
     clientMulticastSocket.joinGroup(multicastHostAddress); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
関連する問題