Можно ли указать, какой сетевой интерфейс для JVM (или IDE) использовать - PullRequest
13 голосов
/ 17 июня 2009

Ситуация выглядит так, у меня есть два сетевых интерфейса в моем MacBook Pro. Один из них является статически определенным интерфейсом Ethernet, а другой - беспроводным интерфейсом с настройкой DHCP.

Я пытаюсь выяснить, как настроить конкретный проект Java для использования только моего статически проводного интерфейса, а не просто выбрать первый в списке через JVM или через мою IDEA (IntelliJ 8)

Мне удалось добиться этого с помощью экземпляра vmware, где моя виртуальная среда питается только от моего проводного интерфейса, но это вызывает проблемы с производительностью рекламы и просто общие проблемы с переключением между windows / osx.

Мне до сих пор не удалось найти свойство jvm, которое позволило бы мне указать, какой ник используется, и я не видел документации для IntelliJ, которая это определяет. Если у кого-то есть идеи, как решить это как можно безболезненнее, я был бы признателен за помощь.

Ответы [ 4 ]

12 голосов
/ 17 июня 2009

java.net.Socket имеет конструктор, который указывает, к какому локальному IP-адресу привязываться, и поскольку каждый сетевой интерфейс получает свой собственный IP-адрес, вы можете использовать его.

Но переход от java.net.Socket к протоколу более высокого уровня (например, HTTP) - это совсем другой вопрос, но вы не указываете, что это будет.

Я не знаю способа сделать это на уровне JVM, к сожалению, только вышеупомянутый программный подход.

4 голосов
/ 17 июня 2009

Сетевая карта, используемая для связи, выбирается операционной системой в зависимости от лучшего «маршрута», доступного для любого адреса, к которому осуществляется доступ. Для приложения, которое находится над драйверами NIC, невозможно выбрать конкретную NIC. Вы можете приблизиться, только когда слушаете порт, привязанный к определенному адресу, что применимо, только если вы используете сервер.

Вы можете попробовать изменить «метрику» маршрута, специфичную для сетевого адаптера, чтобы ОС предпочла его.

2 голосов
/ 19 августа 2014

Да, вы можете указать следующим образом:

int port= 52000; // какой-то свободный порт

MulticastSocket msocket = new MulticastSocket(port);

msocket.setInterface(InetAddress.getByName("172.16.30.205"));

Где 172.16.30.205 - это один из IP-адресов моего компьютера, и я хотел бы общаться через интерфейс.

2 голосов
/ 06 января 2010

Это может помочь: Пример идентификации сетевого интерфейса

"[I] Если у вас есть предпочтения или иным образом необходимо указать, какой сетевой адаптер использовать, вы можете запросить у системы соответствующие интерфейсы и найти адрес на интерфейсе, который хотите использовать."

...