1

我正在尝试配置一个 HTTP POST 请求,但我总是得到SocketTimeoutException。有谁知道我的代码有什么问题?

int TIMEOUT_MILLISEC = 60000;  // = 60 seconds
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);

client = new DefaultHttpClient(httpParams);

StringBuilder builder = new StringBuilder(URL_STRING); 

HttpPost request = new HttpPost(builder.toString());

request.setEntity(new ByteArrayEntity(jobj.toString().getBytes("UTF8")));

HttpResponse response = client.execute(request);
4

2 回答 2

3

请参考此代码。它将帮助您了解处理几乎所有基本的 HttpClient 异常。尝试 {

    // check for request method
    if (method == "POST") {
        // request method is POST
        // defaultHttpClient
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));

        // new
        HttpParams httpParameters = httpPost.getParams();
        // Set the timeout in milliseconds until a connection is
        // established.
        int timeoutConnection = 10000;
        HttpConnectionParams.setConnectionTimeout(httpParameters,
                timeoutConnection);
        // Set the default socket timeout (SO_TIMEOUT)
        // in milliseconds which is the timeout for waiting for data.
        int timeoutSocket = 10000;
        HttpConnectionParams
                .setSoTimeout(httpParameters, timeoutSocket);
        // new
        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();

    } else if (method == "GET") {
        // request method is GET
        DefaultHttpClient httpClient = new DefaultHttpClient();
        String paramString = URLEncodedUtils.format(params, "utf-8");
        url += "?" + paramString;
        HttpGet httpGet = new HttpGet(url);
        // new
        HttpParams httpParameters = httpGet.getParams();
        // Set the timeout in milliseconds until a connection is
        // established.
        int timeoutConnection = 10000;
        HttpConnectionParams.setConnectionTimeout(httpParameters,
                timeoutConnection);
        // Set the default socket timeout (SO_TIMEOUT)
        // in milliseconds which is the timeout for waiting for data.
        int timeoutSocket = 10000;
        HttpConnectionParams
                .setSoTimeout(httpParameters, timeoutSocket);
        // new
        HttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
    }

} catch (UnsupportedEncodingException e) {
    throw new Exception("Unsupported encoding error.");
} catch (ClientProtocolException e) {
    throw new Exception("Client protocol error.");
} catch (SocketTimeoutException e) {
    throw new Exception("Sorry, socket timeout.");
} catch (ConnectTimeoutException e) {
    throw new Exception("Sorry, connection timeout.");
} catch (IOException e) {
    throw new Exception("I/O error(May be server down).");
}
于 2013-05-03T08:33:53.767 回答
0

无需设置套接字超时。删除这一行:
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);

于 2013-11-04T07:28:05.310 回答