java - 調べ方 - 利用可能ポート v6プラス




利用可能なポートを見つけるには? (10)

Eclipse SDKには、 SocketUtilクラスが含まれています。 gitのソースコードを見ているかもしれません。

私はポートを聞くサーバーを起動したい。 私は明示的にポートを指定することができ、それは動作します。 しかし、私はポートを自動的に見つけたいと思っています。 この点で私は2つの質問があります。

  1. どの範囲のポート番号を検索する必要がありますか? (私は12345番、12346番、12347番のポートを使用していました。

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


Java 1.7から、次のようなtry-with-resourceを使用できます。

  private Integer findRandomOpenPortOnAllLocalInterfaces() throws IOException {
    try (
        ServerSocket socket = new ServerSocket(0);
    ) {
      return socket.getLocalPort();

    }
  }

特定のインタフェースでオープンポートを見つける必要がある場合は、代替コンストラクタのServerSocketドキュメントをチェックしてください。

警告:このメソッドによって返されたポート番号を使用するコードはすべて競合状態になります.ServerSocketインスタンスを閉じるとすぐに、別のプロセス/スレッドが同じポートにバインドされることがあります。



Wikipediaによると、「よく知られている」ポートが必要ない場合は、ポート49152を使用する必要があります。

ポートが使用されているかどうかを判断する唯一の方法は、ポートを開こうとすることです。


ServerSocketを使用して独自のサーバーを作成する場合は、空きポートを選択するだけです。

  ServerSocket serverSocket = new ServerSocket(0);
  int port = serverSocket.getLocalPort();

他のサーバ実装は、通常、同様のサポートを有する。 Jettyは 、明示的に設定しない限り、空きポートを選択します。

  Server server = new Server();
  ServerConnector connector = new ServerConnector(server);
  // don't call: connector.setPort(port);
  server.addConnector(connector);
  server.start();
  int port = connector.getLocalPort();

範囲の使用が必要場合:

public int nextFreePort(int from, int to) {
    int port = randPort(from, to);
    while (true) {
        if (isLocalPortFree(port)) {
            return port;
        } else {
            port = ThreadLocalRandom.current().nextInt(from, to);
        }
    }
}

private boolean isLocalPortFree(int port) {
    try {
        new ServerSocket(port).close();
        return true;
    } catch (IOException e) {
        return false;
    }
}

これはJava 6で私のために働く

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

それはあなたにはあまり役に立たないかもしれませんが、私の(Ubuntu)マシンでは、/ etc / servicesファイルを持っていて、少なくともいくつかのアプリケーションによって使用/予約されているポートが与えられています。 これらは、これらのアプリの標準ポートです。

これらのアプリケーションが使用しているデフォルトポートだけが実行されているという保証はありません(できるだけ使用しないでください)。

ポートの数は約半分、UDPの約半分、TCPの半分程度が定義されています。

ファイルは、IANAの情報を使用して作成されます( IANA割り当てポート番号を参照)。


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

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");
}

私は最近、テストを念頭に置いてこれを行うための小さなライブラリをリリースしました。 Mavenの依存関係は次のとおりです。

<dependency>
    <groupId>me.alexpanov</groupId>
    <artifactId>free-port-finder</artifactId>
    <version>1.0</version>
</dependency>

インストールが完了すると、以下の方法で空きポート番号を取得できます。

int port = FreePortFinder.findFreeLocalPort();




port