0

アプリをホスト PC と通信させようとしています (実際の電話で実行している場合も同様です)。私の PC 自体はリモート サーバーと通信します。HTTP 要求を送信し、着信 HTTP 通知をリッスンする Java クラスを作成しました。これらのクラスは、私の PC で完全に実行されます。

Android アプリでそれらを少し調整しました。残念ながら、アプリケーションはインターネットにアクセスできません。すべてのリクエストがタイムアウトします。認証を再確認しました。マニフェスト ファイルでインターネット アクセスが許可されており、パラメーター メニューのアプリケーション情報に効果的に表示されます。私のエミュレーターはインターネットに完全にアクセスできます : ホスト PC 上の Web サイトを含め、インターネットを閲覧できます。

PC の問題を解決するために、まず " http://www.google.fr/index.html " を取得しようとしました。同じクラスの PC では完全に動作しますが、エミュレータでは動作しません。次に、ここでアドバイスされているように、エミュレーターのインターフェースでトラフィックを tcpdump しようとしました。HTTP 要求はありませんでした。

理由がわかりません...

私のエミュレータは Android 2.3.3 (API レベル 10) を実行しています。

これが私の接続クラスです(HTTPClientで試してみましたが、同じ問題がありました):(ログステートメント「リクエスト送信」が最適な場所にないことはわかっています。修正されます:)

package com.example.myApp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.security.InvalidParameterException;

import android.util.Log;

public class ServerConnection {

private String url;
private String method;
private String body;
private String response;
private int responseCode;
private int DEFAULT_TIMEOUT = 4 * 1000;
private int READ_TIMEOUT = 6 * 1000;
private static String TAG = "ServerConnection";

/**
 * Create a new HTTP connection in order to send requests, retrieve responses, delete resources or receive notifications
 * method MUST BE GET, POST or DELETE.
 * @param url
 * @param port
 * @param method
 * @param body
 * @throws InvalidParameterException
 */
public ServerConnection(String url, String method, String body) throws InvalidParameterException{

    this.url = url;
    this.method = method;
    this.body = body;

    Log.d(TAG,"ServerConnection instantiated with parameters");

    if(this.method == "POST")
        this.sendPost();
    else if (this.method =="GET")
        this.sendGet();
    else if (this.method == "DELETE")
        this.sendDelete();
    else
        throw new InvalidParameterException("Invalid HTTP method");
}

/**
 * Sends a HTTP request that does not require any body : for example a GET or DELETE
 * @param url
 * @param method
 * @throws InvalidParameterException
 */
public ServerConnection(String url, String method) throws InvalidParameterException{

    this.url = url;
    this.method = method;

    Log.d(TAG,"HTTP Request instantiated without body");

    if (this.method =="GET")
        this.sendGet();
    else if (this.method == "DELETE")
        this.sendDelete();
    else
        throw new InvalidParameterException("Invalid HTTP method");
}

/**
 * Send a POST request with the specified url, port, body arguments.
 * 
 * @return
 */
public void sendPost(){
    new Thread(new Runnable() {
        public void run() {
            HttpURLConnection connection = null;
            Log.d(TAG,"Sending HTTP POST Request...");

            try{
                URL serverUrl = new URL(ServerConnection.this.url);
                connection = (HttpURLConnection) serverUrl.openConnection();
                InputStream is;

                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Content-Type", "application/xml");
                connection.setRequestProperty("Accept", "application/xml");
                connection.setRequestProperty("Content-Length","" + Integer.toString(ServerConnection.this.body.getBytes().length));
                connection.setUseCaches(false);
                connection.setInstanceFollowRedirects(false);
                connection.setConnectTimeout(DEFAULT_TIMEOUT);
                connection.setReadTimeout(READ_TIMEOUT);

                connection.connect();

                OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());

                writer.write(ServerConnection.this.body);
                writer.flush();
                writer.close();

                // Get the response
                is = connection.getInputStream();
                ServerConnection.this.response = getStringFromInputStream(is);
                ServerConnection.this.responseCode = connection.getResponseCode();
            } catch(SocketTimeoutException ex) {
                ex.printStackTrace();
                Log.d(TAG,"SocketTimeoutException");
                ServerConnection.this.response = null;
                return;
            }catch(MalformedURLException ex) {
                ex.printStackTrace();
                Log.e(TAG,"MalformedURLException");
            } catch (IOException ex) {
                ex.printStackTrace();
                Log.e(TAG,"IOException");
            } finally {
                connection.disconnect();
                Log.d(TAG,"Request sent.");
            }
        }
    }).start();

}



public void sendDelete(){

    new Thread(new Runnable() {
        public void run() {
            HttpURLConnection connection = null;
            Log.d(TAG,"Sending HTTP DELETE Request...");

            try{
                URL serverUrl = new URL(ServerConnection.this.url);
                connection = (HttpURLConnection) serverUrl.openConnection();
                InputStream is;

                connection.setDoOutput(true);
                connection.setRequestMethod("DELETE");
                connection.setRequestProperty("Accept", "application/xml");
                connection.setRequestProperty("Host", ServerConnection.this.url);
                connection.setConnectTimeout(DEFAULT_TIMEOUT);
                connection.setReadTimeout(READ_TIMEOUT);

                connection.connect();
                Log.d(TAG,"Connected");

                // Get the response
                is = connection.getInputStream();
                ServerConnection.this.response = getStringFromInputStream(is);
                ServerConnection.this.responseCode = connection.getResponseCode();


            } catch(SocketTimeoutException ex) {
                ex.printStackTrace();
                Log.d(TAG,"SocketTimeoutException");
                ServerConnection.this.response = null;
                return;
            }catch(MalformedURLException ex) {
                ex.printStackTrace();
                Log.d(TAG,"MalformedURLException");
            } catch (IOException ex) {
                ex.printStackTrace();
                Log.d(TAG,"IOException");
            } finally {
                connection.disconnect();
                Log.d(TAG,"Request sent.");
            }
        }
    });

}

public void sendGet(){
    new Thread(new Runnable() {
        public void run() {
            HttpURLConnection connection = null;
            Log.d(TAG,"Sending HTTP GET Request...");
            try{
                InputStream is;
                URL serverUrl = new URL(ServerConnection.this.url);
                connection = (HttpURLConnection) serverUrl.openConnection();

                connection.setDoOutput(true);
                connection.setRequestMethod("GET");
                connection.setRequestProperty("Accept", "application/xml");
                connection.setRequestProperty("Host", ServerConnection.this.url);
                connection.setConnectTimeout(DEFAULT_TIMEOUT);
                connection.setInstanceFollowRedirects(false);

                connection.connect();
                Log.d(TAG,"Connecting for GET request");

                // Get the response
                ServerConnection.this.responseCode = connection.getResponseCode();
                is = connection.getInputStream();
                ServerConnection.this.response = getStringFromInputStream(is);
                Log.d(TAG,"page received: " + ServerConnection.this.response);

            } catch(SocketTimeoutException ex) {
                ex.printStackTrace();
                Log.d(TAG,"SocketTimeoutException while sending GET request");
                ServerConnection.this.response = null;
            }catch(MalformedURLException ex) {
                ex.printStackTrace();
                Log.e(TAG,"MalformedURLException");
            } catch (IOException ex) {
                ex.printStackTrace();
                Log.e(TAG,"IOException");
            } finally  {
                connection.disconnect();
                Log.d(TAG,"Request sent.");
            }
        }
    }).start();
}

private static String getStringFromInputStream(InputStream is) {
    Log.d(TAG,"Converting InputStream to response String...");
    BufferedReader br = null;
    StringBuilder sxb = new StringBuilder();

    String line;
    try {

        br = new BufferedReader(new InputStreamReader(is));
        while ((line = br.readLine()) != null) {
            sxb.append(line);
        }

    } catch (IOException e) {
        Log.e(TAG,"IOException");
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
                Log.e(TAG,"IOException");
            }
        }
    }

    return sxb.toString();

}

public int getResponseCode(){
    return this.responseCode;
}

    public String getResponse(){
        return this.response;
    }

    @Override
        public String toString() {
        return "CTSConnection [url=" + url + ", method=" + method + ", body="
            + body + ", response=" + response + ", responseCode="
                + responseCode + "]";
        }

}

を起動するとServerConnection cnx = new ServerConnection("http://www.google.fr/index.html","GET");、次のログが表示されます。

08-30 14:42:43.072: D/ServerConnection(581): Sending HTTP GET Request...
08-30 14:42:43.203: D/ServerConnection(581): Connecting for GET request
08-30 14:42:43.252: W/System.err(581): java.io.FileNotFoundException:  http://www.google.fr/index.html
08-30 14:42:43.252: W/System.err(581):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:521)
08-30 14:42:43.252: W/System.err(581):  at com.example.myApp.ServerConnection$3.run(ServerConnection.java:205)
08-30 14:42:43.252: W/System.err(581):  at java.lang.Thread.run(Thread.java:1019)
08-30 14:42:43.252: E/ServerConnection(581): IOException
08-30 14:42:43.252: D/ServerConnection(581): Request sent.

POST リクエスト (有効な本文を含む) の場合、例ServerConnection cnx = new SertverConnection(10.0.2.2:65005,"POST","xml_document_to_string"):

08-30 14:42:43.299: D/ServerConnection(581): Sending HTTP POST Request...
08-30 14:42:47.348: W/System.err(581): java.net.SocketTimeoutException: Connection timed out
08-30 14:42:47.365: W/System.err(581): java.net.SocketTimeoutException: Connection timed out
08-30 14:42:47.365: W/System.err(581):  at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
08-30 14:42:47.365: W/System.err(581):  at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:357)
08-30 14:42:47.365: W/System.err(581):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204)
08-30 14:42:47.365: W/System.err(581):  at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437)
08-30 14:42:47.365: W/System.err(581):  at java.net.Socket.connect(Socket.java:983)
08-30 14:42:47.365: W/System.err(581):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
08-30 14:42:47.365: W/System.err(581):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
08-30 14:42:47.365: W/System.err(581):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:322)
08-30 14:42:47.365: W/System.err(581):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
08-30 14:42:47.365: W/System.err(581):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:285)
08-30 14:42:47.372: W/System.err(581):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:267)
08-30 14:42:47.372: W/System.err(581):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:205)
08-30 14:42:47.372: W/System.err(581):  at com.example.myApp.ServerConnection$1.run(ServerConnection.java:102)
08-30 14:42:47.382: W/System.err(581):  at java.lang.Thread.run(Thread.java:1019)
08-30 14:42:47.382: D/ServerConnection(581): SocketTimeoutException
08-30 14:42:47.382: D/ServerConnection(581): Request sent.

うーん、この問題がどこから来たのか本当にわかりません...何かヒントはありますか?

前もって感謝します !

4

1 に答える 1

0

アプリでインターネットを機能させるには、デフォルトの APN の詳細を編集する必要があります。これを行うには、[設定] > [ワイヤレスとネットワーク] > [モバイル ネットワーク] > [既定の APN]に移動します。

私の場合、ProxyPortを提供する必要がありました。また、プロキシがなかったので、ユーザー名とパスワードのフィールドをクリアする必要がありました。

これにより、エミュレーター上のアプリがインターネットにアクセスできるようになりました。

于 2014-05-05T12:20:33.577 に答える