#java #eclipse #jmdns
Вопрос:
Я пытаюсь работать над приложением, заброшенным в Sourceforge. Он называется kmttg (посмотрите его). Это java-приложение, которое позволяет владельцам Tivo редактировать и изменять записи OnePass на своих устройствах Tivo с компьютера. Срок действия сертификата RPC истекает в следующем месяце, и я пытаюсь понять, смогу ли я это исправить. Я получил код от SourceForge, и я работаю над тем, чтобы заставить его работать на моем компьютере(компьютерах).
У меня есть Eclipse для Java, установленный на моем ноутбуке с Windows 11 и на моем ноутбуке MacBook Pro 14″ под управлением Monterey.
Проблема, с которой я сталкиваюсь, заключается в том, что приложение пытается получить IP-адрес локального компьютера. Он отлично работает на моем компьютере под управлением Windows 11, но не работает на моем Macbook Pro M1 Pro под управлением Monterey.
Проблема возникает в приведенном ниже коде:
package com.tivo.kmttg.main; import java.net.DatagramSocket; import java.net.InetAddress; //import java.util.Date; import java.util.Enumeration; import java.util.Hashtable; import java.util.Stack; import javax.jmdns.JmDNS; import javax.jmdns.ServiceInfo; import com.tivo.kmttg.util.log; public class mdns { private JmDNS jmdns = null; private Hashtablelt;String,ServiceInfogt; SERVICE = new Hashtablelt;String,ServiceInfogt;(); //private int timeout = 5; // ~mins after which mdns listening disabled //private long start_time; public mdns() { try { DatagramSocket socket = new DatagramSocket(); socket.connect(InetAddress.getByName("8.8.8.8"), 10002); InetAddress IP = socket.getLocalAddress(); """ THIS WORKS ON WINDOWS 11 BUT NOT ON THE MACBOOK PRO MACHINE". if (! IP.isReachable(3000)) IP = InetAddress.getLocalHost(); if (! IP.isReachable(3000)) log.error("mdns error: Can't determine valid IP for host running kmttg"); //log.print("IP=" socket.getLocalAddress().getHostAddress()); jmdns = JmDNS.create(IP); socket.close(); //start_time = new Date().getTime(); } catch (Exception e) { log.error("mdns error: " e.getMessage()); } }
Версии Java JRE на обеих машинах-10.0.2. Уровень соответствия-1.8. В противном случае старый код не работает.
Затмение 2021-09 (4.2.1.0)
Все вспомогательные банки взяты из проекта SourceForge и одинаковы на обеих машинах.
НИЖЕ: показаны снимки экрана, когда он работает в Eclipse в Windows 11 и возвращает IP-адрес, а затем снова, когда он не работает на Macbook и возвращает IP 0.0.0.0
Любые мысли будут высоко оценены.
О, кстати, я профессионально кодировал Java с 2000 по 2014 год, и я только сейчас возвращаюсь к нему после выполнения некоторого быстрого кодирования.
Ответ №1:
Попробуйте выполнить итерацию по сетевым интерфейсам:
import java.net.Inet4Address; import java.net.InterfaceAddress; import java.net.NetworkInterface; import java.util.Enumeration; import java.util.Iterator; public class PrintNonloopbackIPv4Addresses { public static void main(String[] args) throws Exception { Enumerationlt;NetworkInterfacegt; networkInterfaces = NetworkInterface.getNetworkInterfaces(); while (networkInterfaces.hasMoreElements()) { NetworkInterface face = networkInterfaces.nextElement(); for (Iteratorlt;InterfaceAddressgt; iterator = face.getInterfaceAddresses().iterator(); iterator.hasNext();) { InterfaceAddress interfaceAddress = iterator.next(); if (interfaceAddress.getAddress().isLoopbackAddress()) continue; if (interfaceAddress.getAddress() instanceof Inet4Address) System.out.println(interfaceAddress.getAddress().getHostAddress()); } } } }
Комментарии:
1. Спасибо вам за этот код, я его запустил и многое узнал об интерфейсах MacBook. Но я все еще озадачен, почему приведенный выше код возвращает IP-адрес в Windows 11, а не в macOS Monterey. Я должен упомянуть, что в kmttg.jar файл из продукта действительно запускается на моем Mac с чистой установкой. У меня есть декомпилятор Java, и после декомпиляции jar я вижу, что код в нем совпадает с исходным кодом, который я загрузил. Я действительно ценю, что вы нашли время, чтобы сделать это, хотя, поскольку это навело меня на след проблемы.
2. Я полагаю, что отследил источник проблемы с помощью проверки подключения SecurityManager. Я получаю проверку исключения Ошибка подключения отказано в доступе («java.net.SocketPermission» «8.8.8.8:10002» «подключение,разрешение»)