1. ホーム

[解決済み】利用可能なポートを見つけるには?

2022-04-10 17:57:31

質問

あるポートをリッスンするサーバを起動したいのですが、どうすればいいですか?明示的にポートを指定すれば動作します。しかし、私は自動的な方法でポートを見つけたいのです。この点で、私は2つの質問があります。

  1. ポート番号のどの範囲で検索すればよいのでしょうか?(ポート12345、12346、12347を使用しましたが問題ありませんでした)。

  2. あるポートが他のソフトウェアによって占有されていないかどうかを調べるにはどうすればよいですか?

解決方法は?

使用されるポートを気にしない場合は、ポート0を指定し ServerSocketコンストラクタ で、任意の空きポートでリッスンします。

ServerSocket s = new ServerSocket(0);
System.out.println("listening on port: " + s.getLocalPort());

もし、特定のポートのセットを使いたいのであれば、おそらく最も簡単な方法は、1つのポートが機能するまでそれらを繰り返し使用することでしょう。このようなものです。

public ServerSocket create(int[] ports) throws IOException {
    for (int port : ports) {
        try {
            return new ServerSocket(port);
        } catch (IOException ex) {
            continue; // try next port
        }
    }

    // if the program gets here, no port in the range was found
    throw new IOException("no free port found");
}

のように使うことができる。

try {
    ServerSocket s = create(new int[] { 3843, 4584, 4843 });
    System.out.println("listening on port: " + s.getLocalPort());
} catch (IOException ex) {
    System.err.println("no available ports");
}