本人在使用httpclient作接口測試的時候,最近程序偶然報socket closed錯誤,上週通過排查發現是request.releaseConnection()這個方法搞得鬼,也是本身學藝不精,沒有真正理解方法的含義,改掉以後其餘接口就沒有出現過這個問題,今天又遇到了,又從新排查了本身的方法,發現還有一種致使socket closed的緣由,由於個人響應對象建立時用的是CloseableHttpResponse類,因此須要關閉,在某些時候response太大可能致使使用EntityUtils.toString(entity)解析實體的時候出錯,我的理解是因爲response的並未徹底解析到entity裏面時已經執行了close()方法致使的,試着把close()方法後置,完美解決問題。java
下面是個人錯誤代碼片斷:編程
try { response.close(); } catch (IOException e2) { output("響應關閉失敗!", e2); } data_size = entity.getContentLength();// 獲取相應數據大小 if (data_size == -1) {// 若是爲-1,則重置data_size data_size = 0; } String content = null; try { content = EntityUtils.toString(entity);// 用string接收響應實體 EntityUtils.consume(entity);// 消耗響應實體 } catch (ParseException e1) { output("解析響應實體異常!", e1); } catch (IOException e1) { output("解析響應實體時java IO 異常!", e1); } // 解析響應
下面是修改以後的代碼片斷:框架
String content = null; try { content = EntityUtils.toString(entity);// 用string接收響應實體 EntityUtils.consume(entity);// 消耗響應實體 } catch (ParseException e1) { output("解析響應實體異常!", e1); } catch (IOException e1) { output("解析響應實體時java IO 異常!", e1); } // 解析響應 try { response.close(); } catch (IOException e2) { output("響應關閉失敗!", e2); }