【问题标题】:Android code to send http request to a local server向本地服务器发送 http 请求的 Android 代码
【发布时间】:2015-11-17 00:41:11
【问题描述】:

我已经实现了 HttpUrlConnection 来向本地 http 服务器(普通 LAN、Wifi、WifiAP)发送请求。该代码适用于普通 Web 服务器 (www.xyz.com),但对于本地服务器 (192.168.x.y:z) 则无法正常工作。

代码:

1) 发出请求的函数

public static String getDef(String urlInput) {
        URL url = null;
        try {
            url = new URL("http://" + urlInput);
            Log.d("http", "calling " + url.toString());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        try {
            HttpURLConnection conn  = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Connection", "close");
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.setReadTimeout(10000 /* milliseconds */);
            conn.setConnectTimeout(15000 /* milliseconds */);
            conn.connect();
            InputStream in = null;
            in = (conn.getInputStream());
            String response =readIt(in,5) ;
            //response = org.apache.commons.io.IOUtils.toString(in, "UTF-8");
            return response;
        } catch (IOException e) {
            Log.e("http","Error");
            e.printStackTrace();
        }
        return "LocalClient didnt work";
    }

2) 调用上述函数的函数。

new AsyncTask<String, Void, String>(){
    @Override
    protected String doInBackground(String... params){
    try {
        return LocalClient.getDef(URL);
    } catch (Exception e){
        e.printStackTrace();


    }
    return "Didnt work";
}
@Override
protected void onPostExecute(String string) {
    message.append(string);
}
}.execute();

3)在服务器上接收到带有以下标头的请求。

GET / HTTP/1.1
Connection: close
User-Agent: Dalvik/2.1.0 (Linux; U; Android 5.1.1; Nexus 5 Build/LYZ28E)
Host: 192.168.0.101
Accept-Encoding: gzip

如果有人能指出我正确的方向,那就太好了。

我也试过 OkHttp,

public static String get(String url) throws IOException {
        OkHttpClient client = new OkHttpClient();
        try {
            Request request = new Request.Builder()
                    .url(url)
                    .build();
            Response response = client.newCall(request).execute();
            resp= response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return resp;
    }

在使用普通网络服务器时,响应正确返回(源),但在使用本地服务器时,我收到以下错误

java.io.EOFException
         W/System.err﹕ at com.android.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:95)
         W/System.err﹕ at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:179)
         W/System.err﹕ at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101)
         W/System.err﹕ at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:628)
         W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:388)
         W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332)
         W/System.err﹕ at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:199)
         W/System.err﹕ at com.demo.demo.http.LocalClient.getDef(LocalClient.java:56)
         W/System.err﹕ at com.demo.demo.wifi.connector$2$2.doInBackground(connector.java:109)
         W/System.err﹕ at com.demo.demo.wifi.connector$2$2.doInBackground(connector.java:105)
         W/System.err﹕ at android.os.AsyncTask$2.call(AsyncTask.java:292)
         W/System.err﹕ at java.util.concurrent.FutureTask.run(FutureTask.java:237)
         W/System.err﹕ at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
         W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
         W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
         W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

【问题讨论】:

  • “没有这样做”?发生什么了?本地服务器和远程服务器的结果有什么不同?
  • 你好!我也遇到过类似的问题。如果有人能指出我们做错了什么,那就太好了。
  • 如何设置本地服务器的urlInput? “本地主机”?
  • @selalerer 我已经编辑了我的问题。远程服务器返回网页源,本地服务器报错;但请求是在本地服务器接收到的。
  • 在我看来,本地服务器正在终止 tcp 连接

标签: android http httpurlconnection iot


【解决方案1】:

问题出在服务器端,已通过使用适当的标头解决。 OkHttp 似乎仍然无法正常工作,并且上面提到的函数“public static String getDef(String urlInput)”可以完美运行。

【讨论】:

    【解决方案2】:

    似乎有一个关于这个问题的开放错误: https://github.com/square/okhttp/issues/1518

    他们建议将android:vmSafeMode="true" 添加到清单文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      相关资源
      最近更新 更多