получение IP-адреса сервера веб-сокетов Android из клиента javascript

я написал приложение, которое действует как сервер веб-сокетов (с библиотекой TooTallNate), и некоторый javascript, который действует как клиент веб-сокета. Мне удалось получить доступ к номерам и группам контактов подключенного устройства Android из браузера, и я могу писать смс, набрав их на компьютере. проблема в том, что пока мне нужно жестко закодировать ip-адрес устройства Android в javascript клиента.

вот как я подключаю веб-клиент к серверу Android.

var ws = new WebSocket("ws://192.xxx.x.xx:8080/");

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

как я могу получить ip сервера программно?

РЕДАКТИРОВАТЬ:

до сих пор для сервера сокетов Android я использую ip, который возвращается этим методом

 private String getIpAddress() {
    String ip = "";
    try {
        Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
                .getNetworkInterfaces();
        while (enumNetworkInterfaces.hasMoreElements()) {
            NetworkInterface networkInterface = enumNetworkInterfaces
                    .nextElement();
            Enumeration<InetAddress> enumInetAddress = networkInterface
                    .getInetAddresses();
            while (enumInetAddress.hasMoreElements()) {
                InetAddress inetAddress = enumInetAddress.nextElement();

                if (inetAddress.isSiteLocalAddress()) {
                    return inetAddress.getHostAddress();
                }
            }
        }
    } catch (SocketException e) {
        Log.e(TAG, e.getMessage(), e);
    }
    return ip;
}

и позже я запускаю сервер так

final String host = getIpAddress();
    final int port = 8080;

    new Thread(new Runnable() {
        @Override
        public void run() {

            SimpleServer server = new SimpleServer(MainActivity.this, new InetSocketAddress(host, port));


            MainActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    info.setText("I'm waiting here: "
                            + port);
                }
            });

            server.run();
        }
    }).start();

когда я открываю браузер с помощью клиента javascript, я использую тот же IP-адрес, который был возвращен описанным выше методом java.


person richard    schedule 13.12.2014    source источник
comment
Вы просто пытаетесь подключиться из браузера к серверу сокетов на своем собственном устройстве? Если это так, вы можете использовать 127.0.0.1 или localhost для обозначения компьютера, на котором вы сейчас работаете.   -  person jfriend00    schedule 14.12.2014
comment
я только что отредактировал свой вопрос. когда я заменяю IP-адрес, который я использую сейчас, на localhost, он не работает.   -  person richard    schedule 14.12.2014
comment
но да, я пытаюсь подключиться из браузера к своему мобильному телефону, который находится в той же сети Wi-Fi.   -  person richard    schedule 14.12.2014
comment
Я не знаю, работает ли localHost на устройстве Android. Вы также пробовали 127.0.0.1? У вас есть настоящий сервер webSocket, который прослушивает соединения протокола webSocket?   -  person jfriend00    schedule 14.12.2014
comment
127.0.0.1 тоже не работал. у меня нет прослушивателя на сервере для соединений через веб-сокеты. проблема в том, что я не могу автоматически подключиться, потому что я не знаю ip, поэтому я также не могу прослушивать какие-либо соединения.   -  person richard    schedule 14.12.2014
comment
Если у вас нет прослушивателя для соединений webSocket, то это ваша первая проблема. Вам не нужно знать IP, чтобы прослушивать входящие соединения. Вам нужно только знать порт, который вы хотите слушать.   -  person jfriend00    schedule 14.12.2014
comment
я долго искал слушателей websocketserver, но ни одна из помощи не соответствовала моей проблеме. на самом деле мне не нужно, чтобы сервер знал IP-адрес клиента, мне нужно, чтобы клиент знал IP-адрес сервера, чтобы я мог подключиться к нему с помощью клиентского javascript: var ws = new WebSocket(ws:/ /192.xxx.x.xx:8080/) в зависимости от того, какое мобильное устройство используется в качестве сервера, оно имеет разный ip и поэтому клиенту браузера необходимо знать фактический ip устройства. Можете ли вы показать мне ссылку на учебник, который мог бы мне помочь?   -  person richard    schedule 16.12.2014
comment
Если вы используете библиотеку TooTallNate, не должен ли ваш сервер быть производным от класса WebSocketServer, чтобы он поддерживал протокол WebSocket? Вот пример использования этой библиотеки: github.com /TooTallNate/Java-WebSocket/blob/master/src/main/   -  person jfriend00    schedule 16.12.2014
comment
да, я знаю этот образец и использовал его с самого начала. до сих пор я понятия не имею, что делать, чтобы клиент браузера javascript знал IP-адрес устройства Android, которое действует как сервер. потому что пока я не могу выполнить клиентское соединение javascript (новый WebSocket (ws://192.xxx.x.xx:8080/), где мне уже нужен IP-адрес сервера), сервер даже не знает о этот клиент, насколько я понял, потому что он не подключен. Мне нужен код для клиента, сообщающий мне, какие IP-адреса существуют, чтобы выбрать правильный, чтобы иметь возможность использовать его для подключения к серверу.   -  person richard    schedule 16.12.2014
comment
Ваш код создает экземпляр SimpleServer. Как это сервер поддерживает протокол WebSocket? Похоже, вы зациклились на проблеме с IP-адресом, которая должна нормально работать с 127.0.0.1. Я думаю, что ваш сервер не использует протокол WebSocket, что может привести к тому, что клиент не сможет подключиться.   -  person jfriend00    schedule 16.12.2014
comment
SimpleServer является производным от WebSocketServer, и мое приложение уже отлично взаимодействует с клиентом. Я могу удаленно управлять своим устройством Android из браузера. единственная проблема заключается в том, что пока мне нужно жестко закодировать IP-адрес текущего устройства Android в клиенте javascript, и я хотел бы получить этот IP-адрес автоматически.   -  person richard    schedule 16.12.2014
comment
я взял SimpleServer из этого кода: github.com/TooTallNate/Java-WebSocket/ вики/Начало работы   -  person richard    schedule 16.12.2014


Ответы (1)


Итак, причем тут http сервер с HTML и JS? Или это просто HTML-страница на вашем компьютере?

  • Если это на вашем телефоне Android, вы можете использовать window.location, чтобы получить IP-адрес сервера и поместить его в функцию new WebSocket();.
  • Если он находится на другом сервере, вы можете написать какое-нибудь приложение на этом сервере, чтобы получать отчеты из вашего приложения Android для хранения IP-адреса, а затем поместить его в свой JS. Вы можете реализовать это на своем компьютере с помощью некоторого приложения Apache и Java.
person Sergey Maksimenko    schedule 08.07.2015
comment
Могу ли я узнать, как сокет может найти конкретный мобильный телефон, используя window.location - person Chickenturtle; 23.09.2018