1

Wi-Fi 経由でローカル ネットワーク内の特別なデバイスに HttpPost を送信しようとしています。単純な Java アプリケーションで同じコードを試してみると動作しますが、Android で同じコードを試してみると、HttpPost を送信できません。

String uri = "http://192.168.3.201:8080/remote/json-rpc/getPeripherals";
Log.i("uri", uri);
String requestBody = "{\"jsonrpc\":\"2.0\",\"method\":"
    + "\"configclient_homedevices/getPeripherals\",\"id\":"
    + "\"1349942076918\",\"params\":[]}";
Log.i("uri", uri);
String contentType = "application/json";
String userpassword = "foo:foo";
String encode = Base64.encodeToString(userpassword.getBytes(),
    Base64.URL_SAFE | Base64.DEFAULT);
try {
    URL url = null;
    url = new URL(uri);
    connection = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
    connection.setDoOutput(true);
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Authorization", "Basic" + encode);
    connection.setRequestProperty("Content-Type", contentType);
    connection.setRequestProperty("Accept", "application/json");
    connection.setRequestProperty("Content-Length",
        "" + Integer.toString(requestBody.getBytes().length));
    connection.setUseCaches(true);
    connection.setDoInput(true);
    DataOutputStream out = null;
    out = new DataOutputStream(connection.getOutputStream());
    out.write(requestBody.getBytes());
    out.flush();
    out.close();
} catch (IOException ioE) {
    connection.disconnect();
    ioE.printStackTrace();
}
// connection.connect();
try {
    if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
        Log.i("Status", toString().valueOf(connection.getResponseCode()));
        InputStream is = connection.getInputStream();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        String line;
        StringBuffer response = new StringBuffer();
        while ((line = rd.readLine()) != null) {
            response.append(line);
            response.append('\r');
        }
        rd.close();
        this.response = response.toString();
        Log.i("Response", response.toString());
    } else {
        Log.i("Status", toString().valueOf(connection.getResponseCode()));
        Log.i("Status-message", connection.getResponseMessage());
        connection.disconnect();
    }
} catch (IOException e) {
    e.printStackTrace();
}

この関数は、AsyncTask から拡張されたサブクラスにあります。マニフェストで Permission.INTERNET を有効にしました

<uses-permission android:name="android.permission.INTERNET" />

結果は次のとおりです。

10-23 14:52:51.590: W/System.err(5983): java.net.SocketException: No route to host
10-23 14:52:51.590: W/System.err(5983):     at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
10-23 14:52:51.590: W/System.err(5983):     at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:369)
10-23 14:52:51.590: W/System.err(5983):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208)
10-23 14:52:51.590: W/System.err(5983):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)
10-23 14:52:51.590: W/System.err(5983):     at java.net.Socket.connect(Socket.java:901)
10-23 14:52:51.590: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:250)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:217)
10-23 14:52:51.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:624)
10-23 14:52:51.600: W/System.err(5983):     at com.febro.myfoo.fooLoginActivitiy$MakeConnection.doInBackground(fooLoginActivitiy.java:339)
10-23 14:52:51.610: W/System.err(5983):     at com.febro.myfoo.fooLoginActivitiy$MakeConnection.doInBackground(fooLoginActivitiy.java:1)
10-23 14:52:51.610: W/System.err(5983):     at android.os.AsyncTask$2.call(AsyncTask.java:252)
10-23 14:52:51.610: W/System.err(5983):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-23 14:52:51.610: W/System.err(5983):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-23 14:52:51.610: W/System.err(5983):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
10-23 14:52:51.610: W/System.err(5983):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
10-23 14:52:51.610: W/System.err(5983):     at java.lang.Thread.run(Thread.java:1020)
10-23 14:52:54.600: W/System.err(5983): java.net.SocketException: No route to host
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method)
10-23 14:52:54.600: W/System.err(5983):     at dalvik.system.BlockGuard$WrappedNetworkSystem.connect(BlockGuard.java:369)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:208)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:431)
10-23 14:52:54.600: W/System.err(5983):     at java.net.Socket.connect(Socket.java:901)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:75)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:48)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect(HttpConnection.java:304)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:89)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpConnection(HttpURLConnectionImpl.java:292)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConnection(HttpURLConnectionImpl.java:274)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1038)
10-23 14:52:54.600: W/System.err(5983):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:736)
10-23 14:52:54.600: W/System.err(5983):     at com.febro.myfoo.fooLoginActivitiy$MakeConnection.doInBackground(fooLoginActivitiy.java:351)
10-23 14:52:54.600: W/System.err(5983):     at com.febro.myfoo.fooLoginActivitiy$MakeConnection.doInBackground(fooLoginActivitiy.java:1)
10-23 14:52:54.600: W/System.err(5983):     at android.os.AsyncTask$2.call(AsyncTask.java:252)
10-23 14:52:54.600: W/System.err(5983):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-23 14:52:54.610: W/System.err(5983):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-23 14:52:54.610: W/System.err(5983):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081)
10-23 14:52:54.610: W/System.err(5983):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574)
10-23 14:52:54.610: W/System.err(5983):     at java.lang.Thread.run(Thread.java:1020)

例外がスローされます

out = new DataOutputStream(connection.getOutputStream());
4

2 に答える 2

3

これは、PC とは異なるネットワークを介してモバイルを接続している場合に発生する可能性があります。ネットワークごとに異なるファイアウォール ルールを設定できます。

PC は通常、内部ネットワーク (通常はイーサネット) 経由で接続されます。携帯電話は通常、より強力なファイアウォール ルールを使用して WIFI 経由で接続されます。

ところで、エラーは次のとおりです。java.net.SocketException: No route to hostこれは、GET と POST とは関係ありません。クライアントが接続できるようになった後、HTTP GET または POST がサーバーに伝達されます。

于 2012-10-23T14:05:48.317 に答える
1

問題の解決策を見つけました。問題は、これを変更した後の URLの固定 IP アドレスでした。ステータス コード 400 Bad Requestを受け取りました。この問題は、リクエストを非同期タスク サブクラスに切り替える前に発生しました。Wireshark プロトコルで見つけた Bad Request の解決策。クライアントは、1 つの http Post で 2 つのハイパーテキスト転送プロトコルを送信します。これはandroid.Base64.encode()メソッドが原因です。エンコーダーは、user:password 文字列をエンコードした後に /n を挿入しました。この場合、クライアントは 1 つの http を基本認証のみで送信し、2 つ目は残りの本体を基本認証なしで送信しました。そのため、サーバーはリクエストを読み取ることができませんでした。

これを変更するには、android.Base64.encode(NO_WARP)を記述する必要があります。このフラグはユーザー名:パスワードを正しくエンコードします。

于 2012-10-26T11:39:43.647 に答える