2015-05-28 4 views
10

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

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

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

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

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

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

+1

сервер должен иметь адрес, он должен находиться в одной сети, а сервер должен быть доступен из этой сети – njzk2

ответ

2

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

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

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

1

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

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

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

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 SOC кет. Если по какой-то причине ваш компьютер Windows не запускает HTTP-сервер на порту 80 (настраивается в httpd.conf, который поставляется с Apache внутри Wamp), вы также можете указать порт в URL-адресе (порт 8080 в этом примере):

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

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

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

Для программирования сокетов здесь две ссылки: 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; 
} 

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

EDIT: Это хорошее объяснение для HTTP vs TCP.

6

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

Когда этот компьютер подключается к телефону, лежащая в основе network interface должны быть использованы, например, Wi-Fi или Ethernet. Также обратите внимание, что localhost лгал на loopback interface. Следует отметить, что интерфейс loopback доступен только в самом устройстве (т. Е. Другие устройства не могут связываться с loopback другого устройства).

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

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

enter image description here

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

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


В Android WebView

Это View предоставляет метод 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 
0

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

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

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

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

<uses-permission android:name="android.permission.INTERNET" /> 
Смежные вопросы