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 組み込みブラウザが 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() でハングするのは今だけです。その後、タイムアウト例外をスローします。ただし、サーバーはリクエストを受け取りません。