0

我正在尝试将 andriod 应用程序与我创建的服务器连接起来。服务器在 Eclipse 中运行,我从 Eclipse 在我的设备中运行该应用程序。

在我的设备中,我有这个错误:

java.net.ConnectionException:无法连接到/ 10.38.11.xx(端口:5541):连接失败:EHOSTUNREACH(没有到主机的路由)

服务器和设备都连接在同一个WIFI下,WIFI在代理下运行。

连接是由 Sockets 使用 TCP/IP 协议实现的。

应用程序代码是:

package com.example.localcli;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.List;

import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity implements LocationListener {
   private static final String[] A = { "n/d", "preciso", "impreciso" };
   private static final String[] P = { "n/d", "bajo", "medio","alto" };
   private static final String[] E = { "fuera de servicio",
                                               "temporalmente no disponible ","disponible" };
   private LocationManager manejador;
   private TextView salida;

   private String proveedor;

   private String dato_localizacion;

   Socket sk;
   BufferedReader entrada;
   PrintWriter out;
   String ip = "10.38.11.73";
   int puerto = 5541;
   boolean conectado;



   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      salida = (TextView) findViewById(R.id.TextView01);


      manejador = (LocationManager) getSystemService(LOCATION_SERVICE);
      log("Proveedores de localización: \n ");
      Conectar();
      muestraProveedores();

      Criteria criteria = new Criteria();
      proveedor = manejador.getBestProvider(criteria, true);
      log("Mejor proveedor: " + proveedor + "\n");
      log("Comenzamos con la última localización conocida:");
      Location localizacion = manejador.getLastKnownLocation(proveedor);
      muestraLocaliz(localizacion); 

      Desconectar();


   }

// Métodos del ciclo de vida de la actividad
   @Override    protected void onResume() {
         super.onResume();
         // Activamos notificaciones de localización
         manejador.requestLocationUpdates(proveedor, 10000, 1, this);
   }

   @Override    protected void onPause() {
         super.onPause();
         // Desactivamos notificaciones para ahorrar batería
         manejador.removeUpdates(this);
   }

//Métodos de la interfaz LocationListener
   public void onLocationChanged(Location location) {
          log("Nueva localización: ");
         muestraLocaliz(location);
   }

   public void onProviderDisabled(String proveedor) {
         log("Proveedor deshabilitado: " + proveedor + "\n");
   }

   public void onProviderEnabled(String proveedor) {
         log("Proveedor habilitado: " + proveedor + "\n");
   }

   public void onStatusChanged(String proveedor, int estado,
         Bundle extras) {
         log("Cambia estado proveedor: " + proveedor + ", estado="
                       + E[Math.max(0,estado)] + ", extras=" + extras +"\n");
   }

//Métodos para mostrar información
   private void log(String cadena) {
         salida.append(cadena + "\n");
   }

   private void muestraLocaliz(Location localizacion) {
         if (localizacion == null)
                log("Localización desconocida\n");
         else
                log(localizacion.toString() + "\n");
   }

   private void muestraProveedores() {
         List<String> proveedores = manejador.getAllProviders();
         for (String proveedor : proveedores) {
             dato_localizacion = stringProveedor(proveedor);
             enviarDato(dato_localizacion);
             log(dato_localizacion); 
         }
         enviarDato("#FIN#");
   }

  // private void muestraProveedor(String proveedor) {
    //     log(stringProveedor(proveedor));
   //}

   private String stringProveedor(String proveedor) {
       LocationProvider info = manejador.getProvider(proveedor);
       String datos_muestra;
       datos_muestra = ("LocationProvider[ "+"\n getName=" + info.getName()+
              ", \n isProviderEnabled=" + 
                                               manejador.isProviderEnabled(proveedor)+ 
              ", \n getAccuracy=" + A[Math.max(0, info.getAccuracy())]+
              ", \n getPowerRequirement=" +
                                                P[Math.max(0, info.getPowerRequirement())]+
              ", \n hasMonetaryCost=" + info.hasMonetaryCost()+
              ", \n requiresCell=" + info.requiresCell()+
              ", \n requiresNetwork=" + info.requiresNetwork()+
              ", \n requiresSatellite=" + info.requiresSatellite()+
              ", \n supportsAltitude=" + info.supportsAltitude()+
              ", \n supportsBearing=" + info.supportsBearing()+
              ", \n supportsSpeed=" + info.supportsSpeed()+" ]\n");

       return datos_muestra;
 }


   public void Conectar() {
       try {
         //Creamos el socket
           sk = new Socket (ip,puerto);

            //Comprobamos que ha conectado correctamente
            if (sk.isConnected() == true) {
                //Inicializamos el buffer de entrada
                entrada = new BufferedReader(
                        new InputStreamReader(sk.getInputStream()));
                //Inicializamos el buffer de salida
                out = new PrintWriter(
                        new OutputStreamWriter(sk.getOutputStream()),true);
                //Indicamos que esta conectado
                conectado = true;

                //Recibimos mensaje
                recibirDatos();

            } else {
                //Indicamos que no esta conectado
                conectado = false;
            }
        } catch (Exception e) {
            //Si hubo algun error mostramos error
            log(" !!! ERROR  !!! "+ e.toString());
            Log.e("Error connect()", "" + e);
            conectado = false;
        }
   }

   public void Desconectar(){
       try{

               sk.close();
       }
       catch (Exception e) {}

   }

   public void recibirDatos() {
       try{
           //Datos de entrada
           String dato_entrada = entrada.readLine();
           //Mientras que el dato que nos envia el servidor sea distinto del
            //comando #FIN# (que nos indica que no hay mas datos a recibir), 
            //mostramos el dato leido y leemos el siguiente
            log("recibiendo ... "); 
            while (!(dato_entrada.equals("#FIN#"))) {
                log(dato_entrada);
                dato_entrada = entrada.readLine();  
            }

            //Al salir del bucle es que ha terminado la transmision de datos
            //log("Recibidos todos los datos");
       }
       catch (Exception e) {
           log("Error al recibir los datos del servidor "+ e.toString());
       }

   }

   public void enviarDato(String datos_out) {
       if(conectado) {
           try {
               //Enviar dato
               out.println(datos_out);
               //Indicamos el fin de la emision con el comando #FIN#
              // out.println("#FIN#");
           }
           catch (Exception e) {
               log("Error al enviar los datos " + e.toString());
           }
       }
   }

}

我想问题出在代理服务器上,但我不知道如何解决。提前感谢您的帮助,如果我的英语听不懂,我很抱歉。

4

1 回答 1

-1

你必须使用http://10.38.11.xx/. 另外,请确保它实际上是在线的,以防万一。

于 2013-09-19T08:30:54.297 回答