10

Java では、Socket または DatagramSocket コンストラクターの単一パラメーターとしてゼロを指定できます。次に、Java はその Socket を空きポートにバインドします。ポート ルックアップを特定の範囲に制限することは可能ですか?

4

4 に答える 4

7

うーん、ドキュメントを読んだ後では、できないと思います。任意のポートにバインドしてから、受け入れられない場合は再バインドするか、成功するまで範囲内のポートに繰り返しバインドできます。2 番目の方法が最も「効率的」になります。

私はこの答えに不安を感じています。なぜなら、それは...エレガントではありませんが、他に何も見つけられないからです:/

于 2008-09-22T15:53:51.603 に答える
2

ソケットを任意の空きポートにバインドすることは、(通常)オペレーティングシステムのソケットサポートの機能です。これはJavaに固有のものではありません。たとえば、Solarisは、nddコマンドによるエフェメラルポート範囲の調整をサポートしています。ただし、範囲を調整できるのはrootのみであり、プログラムだけでなくシステム全体に影響します。

通常のエフェメラルバインディングの動作がニーズに合わない場合は、Socket.bind()を使用して独自の動作を作成する必要があります。

于 2008-09-22T16:02:41.737 に答える
2

必要なコードは次のとおりです。

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?
}
于 2008-09-22T17:03:42.387 に答える
0

使用している関数を実装する Java コードをちらりと見るかもしれません。ほとんどの Java ライブラリは Java で記述されているため、そこに必要なものだけが表示される場合があります。

@Kensterが正しく、それがシステム操作であると仮定すると、ポートごとにバインドするか、テストするかを単純に反復する必要がある場合があります。少し面倒ですが、数行のコードで済むはずです。

于 2008-09-22T16:55:29.583 に答える