2016-05-27 11 views
2

Thisリンクは、非ブロッキングソケットを開くためのチュートリアルを提供します。ただし、ここで提供されるメソッドは任意のランダムポートを取得するオプションを提供しません。また、このjava doc pageに示されているすべてのコンストラクタは、引数としてアドレスをとります。これを行う方法は?Java NIOソケットは、使用可能な任意のポートで接続しますか?

+0

NIOと同じように動作するかどうかはわかりませんが、これを試すことができます:https://stackoverflow.com/questions/2231467/dynamically-choosing-port-numberポート0にバインドするだけで、ランダムな空きポートが選択されます – Warrior

答えて

3

ビットハックの解決策が私のために働いています。通常のSocketを作成して、ポート引数を0にして(ランダムに利用できるソケットを取得する)接続し、そのアドレスを取得することができます。このソケットを閉じ、SocketChannelの作成中にこのアドレスを引数として渡します。 しかし、スレッドが並列にソケットを作成しているマルチスレッドプログラムでは、これが問題になる可能性があるので注意してください。 2つの並列スレッドt1およびt2を考える。 t1がソケットを作成してそのアドレスを取得し、それを閉じた後、コンテキストを切り替えたとします。 t1がこのソケットを使って非ブロッキングチャンネルに接続する前に、t2が同じポートを取得しました。そのような場合には、ノンブロッキング(SocketChannel)接続が確立されなくなるまでループを続けると良いでしょう。

5

あなたがInetSocketAddressのコンストラクタを見れば、ゼロのポート番号は、システムがバインドでの一時的なポートを拾うようになる有効なポート値は0〜65535の間で

ことが述べられています操作。

本質的には、InetSocketAddressを0にして、ランダムなポートが選択されます。

関連する問題