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

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

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

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

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

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

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

    Некоторые основные сведения, которые вы должны знать о

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

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

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

    Введите описание изображения здесь

    И оба имеют свои уникальные 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 

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

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

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

    Что вы хотите (не только для сервера 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; } - 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; } 

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

    EDIT: Хорошее объяснение HTTP и TCP .

    По сути, для 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/"); 

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

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

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

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

     <uses-permission android:name="android.permission.INTERNET" /> 
    Intereting Posts
    Подключение к 802.1x WiFi с помощью тега NFC Как сканировать устройства с низким энергопотреблением Bluetooth с использованием API-интерфейса bluez Файл чтения / записи Android на USB-накопителе OTG программно 1 Keystore для подписывания всех приложений или 1 на приложение? Уведомления FCM Push не показывают отображение заголовков при уведомлении в верхней части экрана Где файл .apk помещается в телефон после установки Android Studio Gradle программно находит тип сборки Android: запрос Volley не работает Интеграция zxing в приложение monodroid Можно ли вызвать stopSelf () в Service.onStartCommand? Как я могу получить текущее название города в android? Android – перехватчик OkHttp – ответ уже «поглощен» Ошибка: – Выполнение неудачно для задачи ': app: dexDebug' в андроид-студии Предотвращение блокирования фонового обслуживания из-за «обнаружения чрезмерного процессора на разветвленном процессе» TextInputLayout Ошибка выравнивания по правому краю