2013-02-21 2 views
1

Я хочу отправить http-запрос с моего устройства Android с помощью локального прокси-сервера. Прежде чем подробно рассказать о своей проблеме, я хочу, чтобы вы знали, что это хорошо работает на всех устройствах, которые я пробовал, кроме Xperia arc S и Xperia T, работающих под Android 4.0.4. У меня есть соединение с данными на обоих устройствах, и оба они работают!Не удается решить хост Android

Я использовал DefaultHttpClient экземпляр, чтобы отправить мой запрос, но когда код достигает той части:

client.execute(request.target, request.post); 

Это разбившийся говоря следующее сообщение об ошибке:

02-21 15:37:25.677: W/System.err(1926): java.net.UnknownHostException: Unable to resolve host "192.168.010.200": No address associated with hostname 
02-21 15:37:25.681: W/System.err(1926):  at java.net.InetAddress.lookupHostByName(InetAddress.java:426) 
02-21 15:37:25.681: W/System.err(1926):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
02-21 15:37:25.681: W/System.err(1926):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
02-21 15:37:25.681: W/System.err(1926):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143) 
02-21 15:37:25.681: W/System.err(1926):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
02-21 15:37:25.681: W/System.err(1926):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
02-21 15:37:25.681: W/System.err(1926):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
02-21 15:37:25.681: W/System.err(1926):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:580) 
02-21 15:37:25.681: W/System.err(1926):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:534) 
02-21 15:37:25.681: W/System.err(1926):  at com.myapp.mms.sender.WapClient.execute(WapClient.java:59) 

В вышеуказанном журнале ошибок, локальный IP-адрес - это мой локальный прокси-узел.

Вот весь мой код:

public Response execute(PostRequest request) throws Exception 
{ 
    // Set proxy and route 
    this.params = client.getParams(); 
    if (isProxySet) ConnRouteParams.setDefaultProxy(params, new HttpHost(this.host, this.port));   
    request.post.setParams(params); 

    // Set header 
    request.post.addHeader("Accept", "*/*, application/vnd.wap.mms-message, application/vnd.wap.sic"); 
    request.post.addHeader("Accept-Language", getCurrentAcceptLanguage(Locale.getDefault())); 

    // Execute the request 
    HttpResponse httpResponse = client.execute(request.target, request.post); 

    // Create the object that will receive the response 
    Response response = new Response(); 

    // Get the response code 
    StatusLine status = httpResponse.getStatusLine(); 
    response.code = status.getStatusCode(); 

    // Get the response body 
    byte[] responseBody = null; 
    HttpEntity entity = httpResponse.getEntity(); 
    if (entity != null) 
    { 
     if (entity.getContentLength() > 0) 
     { 
      responseBody = new byte[(int)entity.getContentLength()]; 
      DataInputStream dis = new DataInputStream(entity.getContent()); 
      dis.readFully(responseBody); 
      dis.close(); 
     } 
     entity.consumeContent(); 
    } 
    response.body = responseBody; 

    return response; 
} 

Есть ли способ обхода слишком это ошибка, которая появляется только под Android 4.0.4 или я делаю неправильно?

Или есть способ сделать то же самое без звонка в InetAddress.getByName?

+0

Вы уже знаете, что такое адрес? Похоже, вы передаете его как String? Это не обязательно. Кроме того, вы пытались оставить лидирующие 0 из 10? –

+1

Вы упомянули, что у вас есть соединение для передачи данных - это соединение Wi-Fi или что-то еще? Я считаю, что подсети 192.168. *. * Предназначены только для внутренних маршрутизаторов. Так что соединение 3g/4g/etc не работает, но wifi будет –

+0

Да, я передаю адрес в виде строки. Но 'setDefaultProxy' принимает экземпляр' HttpHost'. Как я мог сделать иначе? Я не понимаю ваш второй вопрос ... – Manitoba

ответ

4

я нашел способ, который, как представляется, работать на любом устройстве у меня есть:

URL url = new URL(apn); 

    // Set-up proxy 
    Log.d(TAG, "Setting up proxy (" + host + ":" + port + ")"); 
    Properties systemProperties = System.getProperties(); 
    systemProperties.setProperty("http.proxyHost", host); 
    systemProperties.setProperty("http.proxyPort", String.valueOf(port)); 
    systemProperties.setProperty("http.keepAlive", "false"); 

    // Open connection 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

    // Use the URL connection for output 
    connection.setUseCaches(false); 
    connection.setDoOutput(true); 

    // Set the timeouts 
    connection.setConnectTimeout(TIMEOUT); 
    connection.setReadTimeout(TIMEOUT); 

    // Sends the request 
    connection.setRequestProperty("Content-Type", "application/vnd.wap.mms-message"); 
    connection.setRequestProperty("Content-Length", Integer.toString(mms.length)); 

    // Connect to the MMSC 
    Log.d(TAG, "Connecting to APN " + apn); 
    connection.connect(); 

    try 
    { 
     // Upload mms as bytes array 
     Log.d(TAG, "Uploading data (Size: " + mms.length); 
     OutputStream out = connection.getOutputStream(); 
     out.write(mms); 
     out.flush(); 
     out.close(); 

     // Wait for the response 
     Log.d(TAG, "Response code is " + connection.getResponseCode()); 

     if (connection.getContentLength() >= 0) 
     { 
      Log.d(TAG, "Reading response ..."); 
      byte[] responseArray = new byte[connection.getContentLength()]; 
      DataInputStream i = new DataInputStream(connection.getInputStream()); 
      int b = 0; 
      int index = 0; 
      while ((b = i.read()) != -1) 
      { 
       responseArray[index] = (byte) b; 
       index++; 
      } 
      i.close(); 

      // Close the connection 
      Log.d(TAG, "[MMS Sender] Disconnecting ..."); 
      connection.disconnect(); 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 


    return false; 

Я надеюсь, что это поможет некоторым людям с тем же Erro.

Смежные вопросы