Как инициализировать сокет с использованием IPv6 или извлечь адрес IPv4 из адреса IPv6? - PullRequest
0 голосов
/ 03 февраля 2020

Я работаю на сетевом принтере, используя jmdns для обнаружения принтера, с помощью которого я успешно обнаружил принтер.

public void serviceResolved(ServiceEvent ev) {
    // Log.d(TAG, "service resolved: " + ev.getInfo().getName() + ", port: " + ev.getInfo().getPort() + " address: " + ev.getInfo().getInetAddress());
   try{

        NetworkPrinter printer = new NetworkPrinter(ev.getInfo().getName(), ev.getInfo().getInetAddress());
        printers.add(printer);

   }catch (Exception ex){}

}

Я добавляю принтер в свой пользовательский класс, класс здесь.

publi c class NetworkPrinter {

    private String name;
    private InetAddress address;
    private int port=9100;
    public NetworkPrinter(String name, InetAddress address) {
        this.name = name;
        this.address = address;
    }
    public NetworkPrinter(String name, Inet4Address address) {
        this.name = name;
        this.address = address;
    }
    public NetworkPrinter(String ipAddress, int port,String name) {
        try {
            address=InetAddress.getByName(ipAddress);
            this.port=port;
            this.name=name;
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        this.address = address;
    }
    public String getName() {
        return name;
    }
    public int getPortNo() {
        return port;
    }

    public void setName(String name) {
        this.name = name;
    }

    public InetAddress getAddress() {
        return address;
    }

    public void setAddress(Inet4Address address) {
        this.address = address;
    }

    @Override
    public boolean equals(Object o) {

        if (o instanceof NetworkPrinter) {
            NetworkPrinter printer = (NetworkPrinter) o;
            if (printer.name.equals(this.name))
                return true;
        }
        return false;
    }
}

Теперь, когда я хочу дать команда печати на принтер я выбираю обнаруженный принтер из выпадающего списка, который в свою очередь посылает мне объект InetAddress, через который я получаю адресный объект Ipv6 и получаю ip6address, используя метод getHostaddress ().

  if (!isIpv4) 
     {


    if ((address instanceof Inet6Address)) {
        try {
            IPAddressString str = new IPAddressString(address.getHostAddress());

            if (str.isIPv6()) {

     String Ip6Address =InetAddress.getByName(address.getHostName()).getHostAddress();
                //IpAddress = addr2.toNormalizedString();
                portNo = port;
            WifiCommunication wfComm=new WifiCommunication( );   
            wfComm.iniSocket(Ip6Address,portNo)//Socket soc=new Socket() implementation at backend
            wfComm.print();
            }
        } catch (Exception e) {
            //e.getMessage provides validation issue
        }

        // }


    }
}

Возвращает IPv6-адрес в этом формате fe80 :: 9a4b: e1ff: fe37: 74c6, но я не могу подключиться к принтеру с помощью сокета с ipv6. Я могу печатать, используя адрес IPv4. Может кто-нибудь, пожалуйста, сообщите мне, как я могу использовать ipv4 и ipv6 с Socket () для связи. Я пробовал много библиотек для извлечения ipv4 из ipv6, но я не могу подключиться к принтеру. была бы признательна за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...