3

PlayCapによってJavaのネットワークアドレス192.168.103.255ポート3000にブロードキャストされたUDPデータを受信しようとしていますが、設定に問題があります。これが私が持っているものです:

DatagramSocket socket = new DatagramSocket();
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);

bind呼び出しから「java.net.SocketException:alreadybound」が発生します。私はネットワーキングにかなり不慣れなので、ここで何か間違ったことをしている可能性があります。どんな助けでも大歓迎です。

スタックトレースは次のとおりです。

java.net.SocketException: already bound
    at java.net.DatagramSocket.bind(Unknown Source)
    at runner.main(runner.java:16)
4

4 に答える 4

24

古いスレッドを復活させたくありませんが、この質問に対する答えは正しいとは思いません。同様のコードを使用してDatagramSocketを作成したときに、同じ問題に直面しました。

DatagramSocket socket = new DatagramSocket();
socket.setReuseAddress(true);
socket.bind(new InetSocketAddress(InetAddress.getByName("localhost"), 5566));

これにより、SocketExceptionが発生します

Exception in thread "main" java.net.SocketException: already bound
at java.net.DatagramSocket.bind(DatagramSocket.java:376)
at testapplication.TestApplication.main(TestApplication.java:25)

Javaの結果:1

同じポートを占有する別のプロセスがあるためではありませんが、デフォルトのコンストラクターを使用するときに、すでにBOUNDデータグラムソケットを作成しました。

new DatagramSocket()

javadocによると:

DatagramSocket()データグラムソケットを構築し、ローカルホストマシンで使用可能な任意のポートにバインドします。

したがって、例外の理由は、すでにバインドされているソケットをバインドしようとしているためです。それを機能させるには、以下のコンストラクターを使用して非結合ソケットを作成する必要があります

DatagramSocket socket = new DatagramSocket(null);
InetSocketAddress address = new InetSocketAddress("192.168.103.255", 3000);
socket.bind(address);

お役に立てれば...

于 2015-03-09T07:52:37.923 に答える
1

ほとんどの場合、アプリケーションは2回実行されています。または、同じコードを2回実行している可能性があります。同じアプリケーションでも、2回バインドすると失敗する可能性があります。

初心者にとっては、以前の試みをシャットダウンしなかったことが多く(私にも起こりました)、その後、ポートはすでに使用されています。「ポートはすでに使用されています」というメッセージをポップアップ表示するなどして、適切な例外処理を追加してください。

リッスンの場合、通常は明示的なアドレスなしでポートのみをバインドすることに注意してください(これには「0.0.0.0」を使用する必要がある場合があります)。次に、ブロードキャストとユニキャストの両方を受信できます。

私が放送を聞くために使用するコードは単純です:

DatagramSocket s = new DatagramSocket();
s.bind(new InetSocketAddress(port))

私は特定のアドレスにバインドしているのではなく、ポートにのみバインドしていることに注意してください。

于 2012-11-14T07:14:49.453 に答える
1


netstat -a -o -n
を実行すると、このポートがすでにバインドされているかどうかがわかります(これからでも、バインドされているすべてのポートを取得できます)。はいの場合は、他のポートを試してください:)

于 2012-11-14T07:01:35.853 に答える
0

別のアプリケーションですでに使用されている可能性のあるポート3000を確認してください。別のポートを使用してみてください。

于 2012-11-14T06:54:30.103 に答える