Viendo un servidor web sobre un socket. . .

Actualmente apoyo a un cliente con la siguiente arquitectura, utilizada en un proceso de fabricación industrial:

  1. Tienen un programa de Windows que funciona en una PC que controla la maquinaria industrial.

  2. Tienen una aplicación propietaria (que yo mantengo para ellos) que se ejecuta en un dispositivo Android (básicamente un teléfono) que interactúa de forma inalámbrica con el software de PC a través de un socket TCP, por lo que puede controlar remotamente los procesos industriales.

Lo que el cliente quiere ahora es un servidor web que se ejecuta en el PC y un navegador web integrado en la aplicación para controlar algunos procesos adicionales no controlados desde su programa de Windows.

He configurado un servidor WAMP en la PC y una página web de ejemplo, que puedo ver en cualquier navegador en la PC como "localhost". Sé cómo agregar un navegador web a la aplicación de Android a través de una clase de WebView.

Pero no sé cómo hacer que el navegador en el teléfono ver el servidor WAMP en el PC a través de la conexión TCP. ¿Cómo puedo enganchar esas dos cosas?

Alguna información básica que debe conocer

Cuando esa PC se conecta a su teléfono, debe utilizarse una interfaz de red subyacente, por ejemplo, WiFi o Ethernet. También tenga en cuenta que localhost encuentra en la interfaz de loopback . Cabe señalar que la interfaz de loopback sólo es accesible en un dispositivo en sí (es decir, otros dispositivos no pueden comunicarse con loopback de otro dispositivo).

En el otro lado, una vez conectada una interfaz, se le asignaría una dirección IP . Supongo que su teléfono está conectado a ese PC a través de la interfaz WiFi, por lo que en este caso se utilizan dos interfaces.

  • Interfaz wlan de esa PC
  • wlan de su teléfono.

Introduzca aquí la descripción de la imagen

Y ambos tienen sus direcciones IP únicas. Si desea conectarse desde su teléfono a esa PC debe conocer la dirección IP de la interfaz wlan de esa PC.

Si su PC está basada en Linux, podría escribir ifconfig y ver esa dirección IP en el campo wlan0 sección wlan0 ). Para máquinas Windows, lea esta página .


En Android WebView

Esta vista proporciona un método llamado loadUrl que se utiliza para recuperar contenido HTML de máquinas remotas. La cadena que debe pasar a este método se forma de la siguiente manera:

 http://IP_ADDRESS:PORT_NUMBER 

Dónde

  • IP_ADDRESS : Dirección IP de la máquina remota. (En el caso de que haya encontrado en el paso anterior)
  • PORT_NUMBER : Cada máquina puede escuchar en diferentes puertos con diferentes propósitos (por ejemplo, HTTP, FTP, SSH, …). El puerto predeterminado para HTTP es 80.

Por lo tanto, si asumimos que la dirección IP de ese PC es 192.168.0.1 , entonces debería tener:

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

O

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

Bueno, ¿cómo conectar un navegador web a un servidor? En un navegador web de escritorio escriba el nombre del host o la dirección IP en la barra de direcciones del navegador web.

Un proceso similar funciona para un loadUrl incrustado, sólo tiene que llamar al método loadUrl de su instancia de WebView.

La pregunta más importante qué nombre de red tiene su servidor web y prepend http:// . Si el servidor obtiene una dirección IP estática, también puede utilizarla. Sin embargo, usted tiene que asegurarse de que el WAMP no sólo está escuchando en localhost, de lo contrario no se puede acceder desde cualquier dispositivo (pero eso no es una cuestión para Stackoverflow).

Lo que quieres (no sólo para el servidor WAMP, sino para XAMPP, LAMP) es una dirección IP estática a la que puedes conectar en cualquier momento.

Otra cosa que usted mencionó fue los zócalos. Los sockets proporcionan una transacción muy básica de datos y usted necesita cuidar de todo, HTTP es un protocolo de capa de aplicación que es una abstracción sobre la capa de transporte. Los navegadores web (popularmente) usan HTTP. Aquí está la diferencia.

Para la programación de Socket aquí hay dos enlaces: link1 y link2 .

El uso de HTTP requiere el envío de una respuesta GET o POST al servidor, recibida probablemente por php o django que lo lleven desde allí. En cuanto al código. Aqui tienes.

Para la solicitud 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; } 

Para la solicitud 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; } 

Analizar la respuesta para comprobar cómo respondió el servidor. La función de la aplicación debe ser para facilitar al usuario no proporcionarle una solución que ya existe. Te sugeriría que no usas webview (solo muestra la información relevante organizada correctamente).

EDIT: Aquí hay una buena explicación para HTTP vs TCP .

Esencialmente, para la máquina Windows, es necesario conocer la dirección IP. Esta es la dirección en la red que otros dispositivos utilizarán para ponerse en contacto con ella. Si ya tiene un socket TCP / IP abierto, ya conoce esta dirección.

HTTP es un protocolo basado en TCP. Funciona igual que su socket HTTP, escuchando de forma predeterminada las conexiones en el puerto 80. De la documentación, parece que el puerto predeterminado para Wamp es el puerto 80.

Desde la actividad de conexión que contiene la webview (desde aquí ):

 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(); } }); } 

A continuación, cada vez que desee cargar o volver a cargar la URL en la vista web:

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

Donde ipaddress es la IP que utiliza para conectarse usando su socket TCP. Si por alguna razón su máquina Windows no ejecuta el servidor HTTP en el puerto 80 (configurable en el httpd.conf que viene con el Apache dentro de Wamp), también puede especificar el puerto en la URL (puerto 8080 en este ejemplo):

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

Tuve el mismo problema cuando construí mi servidor WAMP y mostrar la base de datos de mi teléfono Android.

El problema es que el WampServer es un localHost y la forma única de conectarse con WAMP es a través de Wifi, porque utilizan la misma infraestructura.

Si desea conectarse a su infraestructura, debe crear un Hosting público e intentarlo de nuevo.

Por favor, muéstrenos el logcat y revise si tiene permiso en su archivo de manifiesto.

 <uses-permission android:name="android.permission.INTERNET" /> 
  • ¿Android 4.x soporta streaming RTSP sobre TCP?
  • Cómo configurar el tiempo de espera keepalive en Android?
  • ¿Cómo puede un emulador androide ponerse en contacto con la máquina desarrolladora del host en eclipse?
  • No se pudo conectar a tcp: 5037: no se puede conectar a 127.0.0.1:5037: No se pudo establecer conexión porque la máquina de destino lo rechazó activamente. (10061)
  • No se puede usar ServerSocket en Android
  • Cliente TCP muy simple
  • android Apache httpclient archivo de carga ,. tiene algún error de reensamble TCP extraño
  • Android: Transferencia de la conexión TCP de 3G a WiFi
  • Comunicación del cliente del servidor TCP de Android
  • No se puede conectar al servidor Openfire (mediante smack api)
  • ¿Cómo mantener una conexión TCP establecida indefinidamente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.