Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Апплеты > Как получить IP в апплете?


Автор: Real McCoy 26.11.2007, 13:23
Здравствуйте все!

Появилась необходимость получать IP или имя машины, на которой запущен апплет. Воспользовался следующим кодом, который нашёл в этом форуме:
Код

    try
    {
      java.net.InetAddress localhost = java.net.InetAddress.getLocalHost();
      System.err.println(localhost.getHostAddress());
      System.err.println(localhost.getHostName());
    }
    catch(java.net.UnknownHostException ex)
    {
      System.err.println("ERROR: " + ex.toString());
    }


Так вот, когда я запускаю апплет в NetBeans'е или просто открываю страничку с апплетом в браузере, то получаю IP типа 192.168.1.х, что меня устраивает, и имя компа. Если же я загружаю страничку с апплетом с локального или удалённого веб-сервера, то получаю 127.0.0.1 и localhost. Почему и как это победить?

Спасибо!

Автор: skhilkov 26.11.2007, 14:33
Real McCoy,  попробуй InetAddress.getAllByName('localhost')... пробежишься по результатам и возьмешь getAddress() у каждого.

Добавлено через 8 минут и 5 секунд
Хотя... так не получится....

Автор: skhilkov 26.11.2007, 14:52
Для сети можно вот так попробовать: 

Код

try {
            Enumeration en =  NetworkInterface.getNetworkInterfaces();
            while(en.hasMoreElements())
            {
                NetworkInterface cur = (NetworkInterface) en.nextElement(); 
                System.out.println();
                Enumeration addrss = cur.getInetAddresses();
                while(addrss.hasMoreElements())
                {
                    InetAddress ia = (InetAddress) addrss.nextElement();
                    System.out.println(ia.getHostAddress());                    
                }
            }
        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Автор: Real McCoy 26.11.2007, 15:57
skhilkov, 
Спасибо, но пока с тем же результатом: если запускаю апплет локально или открываю его страницу с диска в браузере, то получаю список из двух адресов:
127.0.0.1
192.168.1.2

если же открываю его с локального или удалённого веб-сервера, то получаю только 127.0.0.1 :(

Автор: Kangaroo 26.11.2007, 17:22
Real McCoy, 
вот http://forum.java.sun.com/thread.jspa?threadID=619056&start=30&tstart=0 на форуме сана. Там в конце и код приводится, говорят работает. Пробуй и нам расскажешь.

Автор: Real McCoy 26.11.2007, 20:11
Kangaroo, 
Спасибо!

Я тут уже сам кое-что на копал, но то, что прислали Вы, тоже впрок пошло - так сказать, кругозор расширить помогло smile

Итак, по результатам исследований, вот какой апплет у меня получился как синтез двух:
Код

public class GetID extends java.applet.Applet 
{
    private java.awt.TextArea text;

    public GetID()
    {
        setLayout(new java.awt.BorderLayout());
        text = new java.awt.TextArea();
        add("Center", text);
        text.setEditable(false);
    }

    public void init() 
    {
        String name = getDocumentBase().getHost();
        int port = getDocumentBase().getPort();

        if( port == -1 )
            port = 80;

        String ip = "unknown";
    
        try
        {
          java.net.Socket connection = new java.net.Socket(name, port);
        }
        catch(Exception e)
        { 
        }

        try 
        {
            java.net.Socket connection = new java.net.Socket(name, port);

            // Вот это name у меня всегда совпадает с локальным IP клиента (192.168.1.2, например).
            name = connection.getLocalAddress().getHostName();
            // Этот ip - адрес хоста, с которого грузится апплет.
            ip  =  connection.getInetAddress().getHostAddress();
            port = connection.getLocalPort();

            String oldId = "Client ID - " + name + " (" + ip + ":" + port + ")\n";
            System.err.println(oldId);

            // Ещё один вариант получения локального IP.
            String client = connection.getLocalAddress().getHostAddress();

            text.setText(oldId + "Client - " + client + ";\n");
            System.err.println("Client - " + client + ";\n");
        } 
        catch(Exception e) 
        { 
        }
    }
}

Этот апплет даёт правильный результат, если лежит на удалённом веб-сервере в интернете или на веб-сервере в локалке (но не на моей же машине). Показывает 127.0.0.1 и localhost, если лежит на Апаче у меня на машине (и ч неё же запрашивается).

Кстати, сейчас только подумал: может быть у себя я получаю 127.0.0.1 потому, что в %WINDIR%\system32\drivers\etc\hosts и прописано, что 
Код

127.0.0.1    mywebserver

а я делаю запросы именно к нему?

В любом случае, проблема в целом решена. Всем спасибо! Буду рад, если кому-то вышенаписанное окажется полезным, и буду не менее рад, если кто-то добавит подробностей по теме smile

P.S. апплет выложен по адресу http://momentum.110mb.com/jtest/getid.html можно тестить smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)