Java では、Socket または DatagramSocket コンストラクターの単一パラメーターとしてゼロを指定できます。次に、Java はその Socket を空きポートにバインドします。ポート ルックアップを特定の範囲に制限することは可能ですか?
4 に答える
うーん、ドキュメントを読んだ後では、できないと思います。任意のポートにバインドしてから、受け入れられない場合は再バインドするか、成功するまで範囲内のポートに繰り返しバインドできます。2 番目の方法が最も「効率的」になります。
私はこの答えに不安を感じています。なぜなら、それは...エレガントではありませんが、他に何も見つけられないからです:/
ソケットを任意の空きポートにバインドすることは、(通常)オペレーティングシステムのソケットサポートの機能です。これはJavaに固有のものではありません。たとえば、Solarisは、nddコマンドによるエフェメラルポート範囲の調整をサポートしています。ただし、範囲を調整できるのはrootのみであり、プログラムだけでなくシステム全体に影響します。
通常のエフェメラルバインディングの動作がニーズに合わない場合は、Socket.bind()を使用して独自の動作を作成する必要があります。
必要なコードは次のとおりです。
public static Socket getListeningSocket() {
for ( int port = MIN_PORT ; port <= MAX_PORT ; port++ )
{
try {
ServerSocket s = new ServerSocket( port );
return s; // no exception means port was available
} catch (IOException e) {
// try the next port
}
}
return null; // port not found, perhaps throw exception?
}
使用している関数を実装する Java コードをちらりと見るかもしれません。ほとんどの Java ライブラリは Java で記述されているため、そこに必要なものだけが表示される場合があります。
@Kensterが正しく、それがシステム操作であると仮定すると、ポートごとにバインドするか、テストするかを単純に反復する必要がある場合があります。少し面倒ですが、数行のコードで済むはずです。