mysql socket closed,使用httpclient中EntityUtils类解析entity遇到socket closed错误的原因

本人在使用httpclient做接口测试的时候,最近程序偶然报socket closed错误,上周经过排查发现是request.releaseConnection()这个方法搞得鬼,也是自己学艺不精,没有真正理解方法的含义,改掉之后其他接口就没有出现过这个问题,今天又遇到了,又重新排查了自己的方法,发现还有一种导致socket closed的原因,因为我的响应对象创建时用的是CloseableHttpResponse类,所以需要关闭,在某些时候response太大可能导致使用EntityUtils.toString(entity)解析实体的时候出错,个人理解是由于response的并未完全解析到entity里面时已经执行了close()方法导致的,试着把close()方法后置,完美解决问题。

下面是我的错误代码片段:

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);

}

技术类文章精选

非技术文章精选

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 HP-Socket 的 `HttpClient` ,可以使用 `SendChunkData` 方法发送 HTTP chunk 数据。下面是使用 `SendChunkData` 方法的示例代码: ```cpp #include "stdafx.h" #include "HPSocket.h" #include "HttpClient.h" class CMyHttpClientListener : public IHttpClientListener { public: virtual EnHandleResult OnConnect(IHttpClient* pSender) override { // 连接建立时调用 return HR_OK; } virtual EnHandleResult OnSend(IHttpClient* pSender, const BYTE* pData, int iLength) override { // 数据发送完成后调用 return HR_OK; } virtual EnHandleResult OnReceive(IHttpClient* pSender, const BYTE* pData, int iLength) override { // 收到数据时调用 return HR_OK; } virtual EnHandleResult OnClose(IHttpClient* pSender, EnHttpClientCloseFlag enFlag) override { // 连接关闭时调用 return HR_OK; } }; int main(int argc, char* argv[]) { CMyHttpClientListener listener; CHttpClient httpClient(&listener); if (!httpClient.Connect("www.example.com", 80)) { printf("Connect to www.example.com failed\n"); return -1; } // 发送 HTTP chunk 数据 const BYTE* pData = reinterpret_cast<const BYTE*>("This is the first chunk"); int iLength = strlen(reinterpret_cast<const char*>(pData)); if (!httpClient.SendChunkData(pData, iLength)) { printf("Send chunk data failed\n"); return -1; } httpClient.Close(); return 0; } ``` 在上面的示例,我们创建了一个名为 `CMyHttpClientListener` 的自定义 `HttpClient` 监听器,继承自 `IHttpClientListener`。在该监听器,我们重写了 `OnConnect`、`OnSend`、`OnReceive` 和 `OnClose` 方法,用于处理连接建立、数据发送、数据接收和连接关闭的事件。 在 `main` 函数,我们创建了一个 `CHttpClient` 对象,并将监听器传递给它。然后,通过调用 `Connect` 方法来连接目标服务器。接下来,使用 `SendChunkData` 方法发送 HTTP chunk 数据。在示例,我们发送了一个简单的字符串作为第一个 chunk 数据。 最后,我们调用 `Close` 方法关闭连接。 请注意,示例的 IP 地址和端口号是示意性的,请根据实际需要修改为目标服务器的正确配置。此示例仅提供了基本的框架,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值