作成したサーバーにandriodアプリケーションを接続しようとしています。サーバーは Eclipse で実行されており、Eclipse からデバイスでアプリを実行しています。
私のデバイスでは、次のエラーがあります。
java.net.ConnectionException: / 10.38.11.xx (ポート:5541) への接続に失敗しました: 接続に失敗しました: EHOSTUNREACH (ホストへのルートがありません)
サーバーとデバイスの両方が同じ WIFI に接続されており、WIFI はプロキシの下で実行されています。
接続は、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());
}
}
}
}
問題はプロキシサーバーにあると思いますが、解決方法がわかりません。私の英語がよくわからない場合は申し訳ありません。