6

私のアプリケーションでは、hyaveがdatagarmソケットを作成し、ポート(9999)をIP 192.168.173.1にバインドしました。ポートを新しいIP(192.168.173.2)にバインドしたいのですが、実行できません。手順に従ってください。

1 DatagramSocket s= new DatagramSocket(port,ip1);
2 s.disconnect();

s.close();

s= new DatagramSocket(port,ip2);

しかし、これは

java,net,BindException :Address already in use : Cannot bind

どんな洞察も非常に役に立ちます。

4

2 に答える 2

9

バインド解除と再バインドを試みるときに例外を回避するには、作成された各ソケットを再利用可能として設定します。そのためには、バインドされていないソケットを作成する必要があります。

DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(someSocketAddress);

詳細: http ://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setReuseAddress(boolean )

PS TCPを使用する場合のこのような状況でのBindExceptionの主な理由であるタイムアウト期間は、UDPソケットには適用されない場合がありますが、SO_REUSEを使用すると、とにかく即座に再バインドできます。 http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setReuseAddress(boolean

次にいくつかの例を示します。

final int port = 55880;

A)再利用なし、クローズなし=アドレスはすでに使用されています

DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress("127.0.0.1", port));

s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress("localhost", port));

B)再利用、クローズなし=苦情なし

DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress("127.0.0.1", port));

s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress("localhost", port));

C)再利用なし、クローズ=苦情なし(データグラムソケットの場合のみ)

DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress("127.0.0.1", port));
s.close();

s = new DatagramSocket(null);
s.bind(new InetSocketAddress("localhost", port));
s.close();
于 2012-04-09T09:55:48.347 に答える
0

非常に重要です-おそらく一部のユーザーはそれを見逃していました:

DatagramSocket s = new DatagramSocket();

動作しません

上記の例の適切な行は正常に機能します。

DatagramSocket s = new DatagramSocket(null);
于 2019-02-08T14:43:27.740 に答える