0

私のAndroidアプリは、HttpClientを介してHttpリクエストを実行する必要があります。
エミュレータでテストしましたが、正常に動作します。しかし、WIFIがアクティブになっている実際のデバイスでそれを行うと、ANRが発生することがあり、SocketExceptionがスローされることがあります。
デバイスがサーバーに接続できないようです。
logcatのプリントアウトは次のとおりです

また、アプリのパッケージ名は「com.tim.wirelessorder」です。

06-03 09:51:17.803: W/System.err(2307): java.net.SocketException: The operation timed out
06-03 09:51:17.803: W/System.err(2307):     at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:244)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
06-03 09:51:17.803: W/System.err(2307):     at java.net.Socket.connect(Socket.java:1055)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:348)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-03 09:51:17.803: W/System.err(2307):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
06-03 09:51:17.803: W/System.err(2307):     at com.tim.wirelessorder.util.net.HttpUtil.getHttpResponse(HttpUtil.java:43)
06-03 09:51:17.803: W/System.err(2307):     at com.tim.wirelessorder.ui.SignIn$BnListener.onClick(SignIn.java:117)
06-03 09:51:17.803: W/System.err(2307):     at android.view.View.performClick(View.java:2408)
06-03 09:51:17.803: W/System.err(2307):     at android.view.View$PerformClick.run(View.java:8818)
06-03 09:51:17.803: W/System.err(2307):     at android.os.Handler.handleCallback(Handler.java:587)
06-03 09:51:17.803: W/System.err(2307):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-03 09:51:17.803: W/System.err(2307):     at android.os.Looper.loop(Looper.java:123)
06-03 09:51:17.810: W/System.err(2307):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-03 09:51:17.810: W/System.err(2307):     at java.lang.reflect.Method.invokeNative(Native Method)
06-03 09:51:17.810: W/System.err(2307):     at java.lang.reflect.Method.invoke(Method.java:521)
06-03 09:51:17.810: W/System.err(2307):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-03 09:51:17.810: W/System.err(2307):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-03 09:51:17.810: W/System.err(2307):     at dalvik.system.NativeStart.main(Native Method)
06-03 09:51:28.289: W/KeyCharacterMap(2307): Can't open keycharmap file
06-03 09:51:28.289: W/KeyCharacterMap(2307): Error loading keycharmap file '/system/usr/keychars/ilitek_ts.kcm.bin'. hw.keyboards.65538.devname='ilitek_ts'
06-03 09:51:28.289: W/KeyCharacterMap(2307): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

私はエミュレーターでしか実行できないアプリを開発していないので、この問題は本当に厄介です。それは意味がありません。どんな赤ちゃんも問題が何であるかを理解できますか?

私のコードはここにあります。

                    HttpPost request = HttpUtil.getHttpPost(url);
                    List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
                    BasicNameValuePair vName = new BasicNameValuePair(
                            "name", name);
                    list.add(vName);
                    BasicNameValuePair vPwd = new BasicNameValuePair("pwd",
                            pwd);
                    list.add(vPwd);
                    // Log.e("result", "kk:");
                    request.setEntity(new UrlEncodedFormEntity(list));
                    HttpResponse response = HttpUtil
                            .getHttpResponse(request);
// -------- the line above throws the SocketException. this is a static method. the code is added below.

======

public static HttpGet getHttpGet(String url) {
    Log.e("url", url);
    HttpGet request = new HttpGet(url);
    return request;
}


public static HttpPost getHttpPost(String url) {
    HttpPost request = new HttpPost(url);
    return request;
}
public static HttpResponse getHttpResponse(HttpGet request)
        throws ClientProtocolException, IOException {
    // Log.e("http", "in ");
    HttpResponse response = new DefaultHttpClient().execute(request);
    // Log.e("http", (response == null) + " ");
    return response;
}


public static HttpResponse getHttpResponse(HttpPost request)
        throws ClientProtocolException, IOException {
    HttpResponse response = new DefaultHttpClient().execute(request);
// ------- and here it performs a HttpPost request, and it seems the request fails to be sent.
        return response;
    }

これはサーバー上のdo-postコードです。サーブレットはリクエストを受信し、UIでユーザーが入力したクライアントから名前pwdパラメーターを取得します。次に、サーブレットは、名前pwdを使用してMySQLでクエリを実行するDAOをアクティブにします。サーブレットがリクエストを取得するかどうかを確認したい「System.out.println(name)」行が表示されます。実際のデバイスでコードをテストすると、コンソールから印刷されません。これは、サーブレットがリクエストを受信しないことを意味すると思います。

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    OutputStream out = response.getOutputStream();
    String name = request.getParameter("name");
    String pwd = request.getParameter("pwd");
    System.out.println(name);

    UserDao dao = new UserDaoImpl();

    byte[] r = dao.query(name, pwd);
    out.write(r);
    out.close();
}
4

2 に答える 2

1

これを取得するときはいつでも、データ接続がないときです。また、それを実行できる適切な権限があることも確認してください。

于 2012-06-03T03:20:34.470 に答える
0

別の方法で HTTP リクエストを送信してみてください。

url = "http://<your URL>";
URL urlObj = new URL(url);
Log.d("DEBUG", "url=" + url);
URLConnection lu = urlObj.openConnection();

//optional - send parameters
String data = URLEncoder.encode("param", "UTF-8") + "=" + URLEncoder.encode(value, "UTF-8"); //optional - send parameters
// Send data
lu.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(lu.getOutputStream());
wr.write(data);
wr.flush();
//end of "optional"

// Get the response
BufferedReader rd = new BufferedReader(new InputStreamReader(lu.getInputStream()));
String line = "", res = "";
while ((line = rd.readLine()) != null) {
    res += line;
}

wr.flush();
wr.close();
Log.d("DEBUG", "res=" + res);
于 2012-06-05T17:34:19.133 に答える