Видя веб-сервер через сокет.,

В настоящее время я поддерживаю клиента со следующей архитектурой, используемой в промышленном процессе:

  • У них есть программа Windows, работающая на ПК, который управляет промышленным оборудованием.

  • У них есть собственное приложение (которое я поддерживаю для них), работающее на устройстве Android (в основном на телефоне), которое беспроводно взаимодействует с программным обеспечением ПК через сокет TCP, поэтому оно может удаленно управлять этими промышленными процессами.

Теперь клиенту нужен веб-сервер, работающий на ПК, и веб-браузер, встроенный в приложение, для управления некоторыми дополнительными процессами, которые не контролируются его программой Windows.

Я установил WAMP-сервер на ПК и примерную веб-страницу, которую я могу видеть в любом браузере на ПК как "localhost". Я знаю, как добавить веб-браузер в приложение Android через класс WebView.

Но я не знаю, как сделать браузер на телефоне, см. WAMP-сервер на ПК через TCP-соединение. Как мне перехватить эти две вещи?

Ответ 1

Основная информация, которую вы должны знать

Когда этот ПК подключается к вашему телефону, необходимо использовать базовый сетевой интерфейс, например, WiFi или Ethernet. Также обратите внимание, что localhost находится на loopback-интерфейсе. Следует отметить, что интерфейс loopback доступен только в самом устройстве (т.е. Другие устройства не могут связываться с loopback другого устройства).

С другой стороны, как только интерфейс подключен, ему будет присвоен IP-адрес. Я предполагаю, что ваш телефон подключен к этому ПК через интерфейс WiFi. Поэтому в этом случае используются два интерфейса.

  • wlan интерфейс этого ПК
  • wlan вашего телефона.

enter image description here

И оба имеют свои уникальные IP-адреса. Если вы хотите подключиться с вашего телефона к этому компьютеру, вы должны знать IP-адрес интерфейса wlan этого ПК.

Если ваш компьютер основан на Linux, вы можете написать ifconfig и увидеть этот IP-адрес в поле inet addr (в разделе wlan0). Для машин Windows прочитайте эту страницу.


В Android WebView

В этом представлении представлен метод loadUrl, который используется для извлечения содержимого HTML с удаленных компьютеров. Строка, которую вы должны передать этому методу, формируется следующим образом:

http://IP_ADDRESS:PORT_NUMBER

Где

  • IP_ADDRESS: IP-адрес удаленной машины. (В вашем случае тот, который вы нашли на предыдущем шаге)
  • PORT_NUMBER: каждый компьютер может прослушивать разные порты для разных целей (например, HTTP, FTP, SSH,...). Порт по умолчанию для HTTP - 80.

Поэтому, если мы предположим, что IP-адрес этого ПК 192.168.0.1, вы должны иметь:

webView.loadUrl("http://192.168.0.1:80");

или

webView.loadUrl("http://192.168.0.1");
// Because 80 is the default port number for HTTP

Ответ 2

Хорошо, как вы подключаете веб-браузер к серверу? На веб-браузере на рабочем столе вы вводите имя хоста или IP-адрес в строке адресов веб-браузера.

Аналогичные процессы работают для встроенного веб-браузера, вам просто нужно вызвать метод loadUrl вашего экземпляра WebView.

Более важный вопрос, какое сетевое имя имеет ваш веб-сервер, и добавьте http://. Если сервер получает статический IP-адрес, вы тоже можете его использовать. Однако вы должны убедиться, что WAMP не только прослушивает локальный хост, в противном случае он не может быть доступен с любого устройства (но это не вопрос для Stackoverflow).

Ответ 3

Что вы хотите (не только для сервера WAMP, но и для XAMPP, LAMP) - это статический IP-адрес, к которому вы можете подключиться в любой момент времени.

Еще одна вещь, о которой вы говорили, это сокеты. Сокеты обеспечивают очень базовую транзакцию данных, и вам нужно все заботиться, HTTP - это протокол уровня приложения, который является абстракцией над транспортным уровнем. Веб-браузеры (в основном) используют HTTP. Здесь есть разница.

Для программирования Socket здесь две ссылки: link1 и link2.

Использование HTTP требует отправки ответа GET или POST на сервер, полученного, вероятно, php или django, которые берут его оттуда. Что касается кода. Здесь вы идете.

Для запроса GET

public String sendGetRequest() {
    HttpClient client = new DefaultHttpClient();
    URI website;
    try {
        website = new URI(url);
        HttpGet request = new HttpGet();
        request.setURI(website);

        HttpResponse response = client.execute(request);
        return response;
    } catch (URISyntaxException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

Для запроса POST

public String sendPostRequest(ArrayList<NameValuePair> nameValuePairs) {
    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);

    try {
        // Add your data
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        // Execute HTTP Post Request
        HttpResponse response = httpclient.execute(httppost);
        if (response != null)
            return response;
        else
        {
            Log.e("Request", "response is null");
            return null;
        }

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
    } catch (IOException e) {
        // TODO Auto-generated catch block
    }
    return null;
}

Разберите ответ, чтобы проверить, как сервер ответил. Функция приложения должна быть упрощена, чтобы пользователь не предоставил ему решение, которое уже существует. Я предлагаю вам не использовать веб-просмотр (просто отобразите соответствующую информацию, организованную должным образом).

РЕДАКТИРОВАТЬ: Вот хорошее объяснение HTTP vs TCP.

Ответ 4

По сути, для машины Windows вам необходимо знать IP-адрес. Это адрес в сети, который другие устройства будут использовать для связи с ним. Если у вас уже есть открытый TCP/IP-сокет, вы уже знаете этот адрес.

HTTP - это протокол на основе TCP. Он работает так же, как ваш HTTP-сокет, прослушивая по умолчанию для соединений на порту 80. Из документации выглядит, как будто порт по умолчанию для Wamp - порт 80.

Из вашей активности подключения, содержащей веб-просмотр (от здесь):

private WebView webview;

public void onCreate(Bundle savedInstanceState) {
        [initialize stuff as needed ...]

        this.webview = (WebView)findViewById(R.id.webview);
        WebSettings settings = this.webview.getSettings();
        settings.setJavaScriptEnabled(true);
        this.webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);

        webview.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.i(TAG, "Processing webview url click...");
                view.loadUrl(url);
                return true;
            }

            public void onPageFinished(WebView view, String url) {
                Log.i(TAG, "Finished loading URL: " +url);
                if (progressBar.isShowing()) {
                    progressBar.dismiss();
                }
            }

            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Log.e(TAG, "Error: " + description);
                Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
                alertDialog.setTitle("Error");
                alertDialog.setMessage(description);
                alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        return;
                    }
                });
                alertDialog.show();
            }
        });
}

Затем, когда вы хотите загрузить или перезагрузить URL-адрес в веб-представление:

this.webview.loadUrl("http://ipaddress/");

Где ipaddress - это IP-адрес, который вы используете для подключения через ваш TCP-сокет. Если по какой-то причине ваш компьютер Windows не запускает HTTP-сервер на порту 80 (настраивается в httpd.conf, который поставляется с Apache внутри Wamp), вы также можете указать порт в URL-адресе (порт 8080 в этом примере):

this.webview.loadUrl("http://ipaddress:8080/");

Ответ 5

У меня была такая же проблема, когда я построил свой WAMP-сервер и отобразил базу данных с моего телефона Android.

проблема заключается в том, что WampServer является localHost, и уникальный способ подключения с WAMP осуществляется через Wi-Fi, поскольку использует ту же инфраструктуру.

Если вы хотите подключиться к своей инфраструктуре, вы должны создать общедоступный хостинг и повторите попытку.

Пожалуйста, покажите нам logcat и просмотрите, если у вас есть разрешение на файл манифеста.

<uses-permission android:name="android.permission.INTERNET" />