0

Web リクエストの作成中に Android アプリが送信している正確なヘッダーを確認したいので、ローカル マシン上の Java で単純なサーバー アプリを作成し、Android アプリにそれを呼び出させるだけだと考えました。次に、リクエストをコンソールにダンプするだけで、アプリが何を送信しているかを確認できます。ただし、接続しようとすると、アプリがハングして応答を停止します。

接続のみを受け入れ、取得したデータを sysout する単純なサーバーを作成しました。サーバーは正常に動作し、コンピューターの Web ブラウザーからヒットすると、Web ブラウザーの要求からヘッダーが出力されます。だから私はサーバーが正常に動作することを知っています。

私のアプリのコードは次のとおりです。

URL url = new URL("http://192.168.1.11:9000");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.connect();

PrintWriter writer = new PrintWriter(connection.getOuputStream(), true);
writer.write("hi");
writer.close();

単純。結局、ヘッダーだけが必要です。今、私は投稿なしで使用を開始しました:

URL url = new URL("http://192.168.1.11:9000");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
in.close();

しかし、それはうまくいきません。アプリは getInputStream() リクエストで応答を停止します。止まるだけで続きません。サーバーも接続要求を受け取りません。

全体として、アプリは URL 接続の getInputStream でブロックされており、その理由がわかりません。

今、私はしばらく検索し、これらを見つけました:

ソケット経由でサーバーと通信する Android アプリ

ソケット例外 ソケットが接続されていません Android

Android 組み込みブラウザが LAN 上のサーバーに接続できない

java.net.URLConnection を使用して HTTP 要求を起動および処理する

クライアント ソケットが実行中のソケット サーバーに接続できない

しかし、何も役に立ちません。この問題を抱えているすべての人がそうであるように、私はローカルホストを使用していません.Android 10.0.0.2を使用しようとしましたが、それも機能しません。

私は何かを制限するネットワーク上にいません (私は家にいます)、サーバーにメッセージを送信するために示されている最初のコード セットを使用しようとしましたが、それでも機能しません (正常に動作しますが、サーバーは決して動作しません)。クライアントを取得します。それはどのように機能しますか?)。

URLConnection と HttpURLConnection の両方を使用してみましたが、どちらも同じ問題を抱えています。

アプリでインターネット権限も使用しているため、必要な権限があります。

この時点で途方に暮れています。サーバーに単純な呼び出しを行うことができないのはなぜですか?

編集

Androidドキュメントの正確なコードを使用しました:

private String downloadUrl(String myurl) throws IOException {
    InputStream is = null;
    // Only display the first 500 characters of the retrieved
    // web page content.
    int len = 500;

    try {
        URL url = new URL("http://10.0.2.2:9000");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        int response = conn.getResponseCode();
        is = conn.getInputStream();

        // Convert the InputStream into a string
        String contentAsString = readIt(is, len);
        return contentAsString;

        // Makes sure that the InputStream is closed after the app is
        // finished using it.
    } finally {
        if (is != null) {
            is.close();
        }
    }
}

しかし、それでもうまくいきません。まだハングしています。getResponseCode() でハングするのは今だけです。その後、タイムアウト例外をスローします。ただし、サーバーはリクエストを受け取りません。

4

3 に答える 3

0

あなたの問題の根本は、接続が完了する前に Android がアプリを FCing していることだと思います。Google が提供するトレーニング ガイドに従って、呼び出しを AsyncTask でラップし、問題が解決するかどうかを確認することをお勧めします。

于 2013-07-31T02:17:22.500 に答える
0

HTTP GET リクエストを作成するために使用する Java クラスがあります。使用している Android コードとほぼ同じであると推測しているため、以下にコードの関連部分をダンプしました。私はこのクラスを Java アプリケーション (Android ではなく) で何度も使用しました。

currentUrl = new URL(getUrl);
conn = (HttpURLConnection)currentUrl.openConnection();
conn.setRequestProperty("Cookie",  getCookies(currentUrl.getHost()));
conn.setRequestProperty("User-Agent", "robadob.org/crawler");
if(referrer!=null){conn.setRequestProperty("Referrer",referrer);}
conn.setRequestMethod("GET");
conn.connect();
//Get response
String returnPage = "";
String line;
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = rd.readLine()) != null) {
    returnPage+=line+"\n";
}
rd.close();

コードが失敗する原因となる明らかなものは何も見えませんが、これから何かを見つけることができることを願っています. ヘッダーを設定するのsetRequestPropertyは私なので、それらは必要ありません。

それが失敗した場合は、コードを System.out でフラッディングして、どのステートメントで停止しているかを確認できます。

于 2013-07-31T17:57:36.647 に答える