Я пытаюсь разработать систему, в которой есть разные узлы, которые работают на разных системах или на разных портах в одной системе.
Теперь все узлы создают Socket с целевым IP-адресом в качестве IP-адреса специального узла, известного как узел начальной загрузки. Затем узлы создают свои собственные ServerSocket
и начинают прослушивать соединения.
Узел начальной загрузки поддерживает список узлов и возвращает их при запросе.
Теперь мне нужно, чтобы узел зарегистрировал свой IP на узле начальной загрузки. Я попытался использовать, как cli.getInetAddress()
только клиент подключается к ServerSocket
узлу начальной загрузки, но это не сработало.
- Мне нужно, чтобы клиент зарегистрировал свой PPP IP, если он доступен;
- В противном случае LAN IP, если доступно;
- В противном случае он должен зарегистрировать 127.0.0.1, предполагая, что это тот же компьютер.
Используя код:
System.out.println(Inet4Address.getLocalHost().getHostAddress());
или
System.out.println(InetAddress.getLocalHost().getHostAddress());
Мой IP-адрес соединения PPP: 117.204.44.192, но вышеприведенное возвращает мне 192.168.1.2
РЕДАКТИРОВАТЬ
Я использую следующий код:
Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
NetworkInterface n = (NetworkInterface) e.nextElement();
Enumeration ee = n.getInetAddresses();
while (ee.hasMoreElements())
{
InetAddress i = (InetAddress) ee.nextElement();
System.out.println(i.getHostAddress());
}
}
Я могу получить все IP-адреса, связанные со всеми NetworkInterface
s, но как их различить? Это вывод, который я получаю:
127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19
Ответы:
Этот способ хорошо работает при наличии нескольких сетевых интерфейсов. Всегда возвращает предпочитаемый исходящий IP. Пункт назначения
8.8.8.8
не должен быть доступным.Connect
на UDP-сокете имеет следующий эффект: он устанавливает пункт назначения для отправки / записи, отбрасывает все пакеты с других адресов и - что мы и используем - переводит сокет в «подключенное» состояние, устанавливает соответствующие поля. Это включает в себя проверку наличия маршрута к пункту назначения в соответствии с таблицей маршрутизации системы и соответствующей настройкой локальной конечной точки. Последняя часть официально не документирована, но выглядит как неотъемлемая черта API сокетов Berkeley (побочный эффект состояния UDP «подключен»), который надежно работает как в Windows, так и в Linux в разных версиях и дистрибутивах.Таким образом, этот метод даст локальный адрес, который будет использоваться для подключения к указанному удаленному хосту. Реальное соединение не установлено, поэтому указанный удаленный IP-адрес может быть недоступен.
Редактировать:
Как говорит @macomgil , для MacOS вы можете сделать это:
источник
Это может быть немного сложнее в самом общем случае.
На первый взгляд,
InetAddress.getLocalHost()
должен дать вам IP-адрес этого хоста. Проблема заключается в том, что хост может иметь множество сетевых интерфейсов, и интерфейс может быть связан с несколькими IP-адресами. И в довершение всего, не все IP-адреса будут доступны вне вашей машины или вашей локальной сети. Например, это могут быть IP-адреса для виртуальных сетевых устройств, IP-адреса частных сетей и т. Д.Это означает, что возвращаемый IP-адрес
InetAddress.getLocalHost()
может быть неправильным для использования.Как вы можете справиться с этим?
NetworkInterface.getNetworkInterfaces()
все известные сетевые интерфейсы на хосте, а затем выполнять итерацию по адресам каждого NI.InetAddress.getByName()
для поиска основного IP-адреса. (Но как вы это получаете, и как вы справляетесь с балансировщиком нагрузки на основе DNS?)Таким образом,
InetAddress.getLocalHost()
обычно это будет работать, но вам может потребоваться предоставить альтернативный метод для случаев, когда ваш код выполняется в среде со «сложной» сетью.На самом деле API InetAddress предоставляет методы для проверки обратной связи, локальных ссылок, локальных сайтов, многоадресных и широковещательных адресов. Вы можете использовать их, чтобы выбрать наиболее подходящий IP-адрес.
источник
use getLocalHost().getHostAddress()
что-то опубликуете, вы можете увидеть это,0.0.0.0
глядя на другой компьютер в сети. Это объясняется здесь. Вот что случилось со мной, когда я использовал беседку на двух компьютерахРазмещение здесь протестированного кода обхода неоднозначности IP- адреса с https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () неоднозначно в системах Linux):
источник
Для этой цели вы можете использовать Java- класс InetAddress .
Выход для моей системы =
IP of my system is := 10.100.98.228
getHostAddress () возвращает
ИЛИ вы также можете сделать
Выход =
IP of my system is := RanRag-PC/10.100.98.228
источник
Когда вы ищете свой «локальный» адрес, вы должны заметить, что каждая машина имеет не только один сетевой интерфейс, и каждый интерфейс может иметь свой собственный локальный адрес. Это означает, что ваша машина всегда владеет несколькими «локальными» адресами.
Различные «локальные» адреса будут автоматически выбраны для использования при подключении к различным конечным точкам. Например, когда вы подключаетесь
google.com
, вы используете «внешний» локальный адрес; но когда вы подключаетесь к вашемуlocalhost
, ваш локальный адрес всегдаlocalhost
сам по себе, потому что localhost - это просто петля.Ниже показано, как узнать ваш локальный адрес, когда вы общаетесь с
google.com
:источник
Пример в scala (полезно в файле sbt):
источник
РЕДАКТИРОВАТЬ 1: обновленный код, так как предыдущая ссылка больше не существует
АКТУАЛЬНАЯ ВЕРСИЯ: Это перестало работать
Надеюсь, этот фрагмент может помочь вам достичь этого:
источник
whatismyip.com
течение некоторого времени, ваше приложение также было бы недоступно :(. Или оно будет возвращать мусорные данные и вызывать непредвиденное поведение. Кроме того, это возвращает внешний ключ. большинство IP-адресов обнаруживаютсяwhatismyip.com
, а не обязательно по IP-адресу компьютера, который вы используетево-первых импортировать класс
в классе
источник
Вы можете использовать
java.net.InetAddress
API. Попробуй это :источник
источник
Это рабочий пример ПРИНЯТОГО ответа выше! Этот класс NetIdentity будет хранить как внутренний IP-адрес хоста, так и локальную петлю. Если вы работаете на DNS-сервере, как упоминалось выше, вам может потребоваться добавить еще несколько проверок или, возможно, перейти в раздел «Файл конфигурации».
Когда я запускаю этот код, я на самом деле получаю распечатку так:
Для моего использования я настраиваю Upnp Server, это помогло понять «шаблон», который я искал. Некоторые из возвращаемых объектов - это адаптеры Ethernet, сетевые адаптеры, виртуальные сетевые адаптеры, драйверы и клиентские адаптеры VPN. Не у всех тоже есть адрес. Так что вы захотите пропустить интерфейсные объекты, которые этого не делают.
Вы также можете добавить это в цикл для текущего
NetworkInterface i
И вы увидите информацию в своем выводе так:
источник
Используйте InetAddress.getLocalHost (), чтобы получить локальный адрес
источник
источник
Довольно упрощенный подход, который, кажется, работает ...
источник
Это получает IP-адрес вашей сети, если ваш компьютер является частью сети
источник
Обычно, когда я пытаюсь найти свой публичный IP-адрес, такой как cmyip.com или www.iplocation.net , я использую этот способ:
источник
Поскольку моя система (как и многие другие системы) имела различные сетевые интерфейсы.
InetAddress.getLocalHost()
илиInet4Address.getLocalHost()
просто вернул тот, который я не хотел. Поэтому мне пришлось использовать этот наивный подход.Только будьте осторожны, что при таком подходе я уже знал, что мой желаемый IP-адрес находится в
192.168.2
подсети.источник
источник