JVM(またはIDE)が使用するネットワークインターフェイスを指定することは可能ですか?
-
06-07-2019 - |
質問
状況は次のようになります。MacBookProには2つのネットワークインターフェイスがあります。 1つは静的に定義されたイーサネットインターフェイスであり、もう1つはDHCPが構成されたワイヤレスインターフェイスです。
JVMまたはIDEA(IntelliJ 8)のいずれかを使用してリストの最初のインターフェイスを選択するのではなく、静的に有線されたインターフェイスのみを使用するように特定のJavaプロジェクトを構成する方法を見つけようとしています
私は、仮想環境で有線インターフェイスのみを使用しているvmwareのインスタンスを介してこれを達成することができましたが、この広告のパフォーマンスの問題と、ウィンドウ/ osxを切り替える一般的な頭痛の種です。
これまでのところ、使用するNICを指定できるjvmプロパティを見つけることができませんでした。また、それを定義するIntelliJのドキュメントも見ていません。誰もこれを可能な限り痛みを伴わずに解決する方法についてアイデアを持っているなら、私は助けに感謝します。
解決
はい、次の方法で指定できます:
int port = 52000;
// some free port
MulticastSocket msocket = new MulticastSocket(port);
msocket.setInterface(InetAddress.getByName(" 172.16.30.205"));
172.16.30.205は私のPCのIPアドレスの1つであり、インターフェースを介して通信したいのです。
他のヒント
java.net.Socketには、バインドするローカルIPアドレスを指定するコンストラクターがあり、各ネットワークインターフェイスは独自のIPアドレスを取得するため、それを使用できます。
しかし、java.net.Socketからより高いレベルのプロトコル(HTTPなど)に到達することは完全に別の問題ですが、それがどうなるかを指定しません。
これを行うJVMレベルの方法はわかりませんが、悲しいことに、上記のプログラムによるアプローチだけです。
通信に使用されるNICは、アクセスされるアドレスに最適な「ルート」に応じて、オペレーティングシステムによって選択されます。 NICドライバの上にあるアプリケーションが特定のNICを選択する方法はありません。特定のアドレスにバインドされたポートでリッスンしている場合にのみ、閉じることができます。これは、サーバーを実行している場合にのみ適用されます。
OSに強制的に優先させるには、NICに固有のルートの「メトリック」を変更してみてください。
これは役に立つかもしれません: ネットワークインターフェースの識別の例
" [I]好みがある場合、または使用するNICを指定する必要がある場合は、システムに適切なインターフェイスを照会し、使用するインターフェイスのアドレスを見つけることができます。"