解决QTcpSocket发送数据成功,但接收端接收不全的问

createh53个月前 (02-01)技术教程21

这里主要是这样的Qt写了一个服务端,在开发环境下,没出现任何问题,但在生产环境下,就出现问题了。

使用Fiddler的简单抓了下包:

发现Body只有27045,而请求里面确是这样的。


这里就很有意思了。

这里的Qt服务端,在发送完数据后,会主动和客户端断开连接。不像其他的web服务器,需要等客户端来断开连接。

这里用curl请求会有报错:

transfer closed with 25527 bytes remaining to read

大体上的意思就还有这么多位的数据没读,通道就被关闭了。

在Qt服务端关于关闭的代码是这样的:

tcpSocket->write(HttpResponse::message(json->toJson()).toUtf8());
tcpSocket->waitForBytesWritten();
tcpSocket->disconnectFromHost();

并且这个tcpSocket->write的返回值,也是正确的,说明的确把要发送的数据送到了网卡中让其发送。并且waitForBytesWritten也是返回true的。

个人感觉主要的问题就是tcpSocket->waitForBytesWritten(),可能是Qt的一个BUG,我这里用的是5.5.1

感觉这里Qt做的没有我想象中的那样。

这里的解决办法有3个:

①数据分包发送,有些web服务器会把发送的数据分成几个包发送给客户端。这种方式就能解决上面的问题。

②简单修改下代码逻辑,比如改成了这样的:

qint64 writeSize = tcpSocket->write(HttpResponse::message(json->toJson()).toUtf8());
qDebug() << "writeSize: " << writeSize;
 
if(!tcpSocket->waitForBytesWritten(10 * 1000)){
 
    qDebug() << "error:" << tcpSocket->errorString();
}
 
if(!tcpSocket->waitForDisconnected(10 * 1000)){
 
    tcpSocket->disconnectFromHost();
}
delete json;
delete tcpSocket;

③加一个waitForDisconnected()如下:

tcpSocket->disconnectFromHost();
tcpSocket->waitForDisconnected();

建议优先用第三种,不行就再考虑第一种和第二种。

相关文章

JavaWEB前端向服务器端发送对象(java向服务器发送数据)

最近项目中需要做一个关于批量删除的功能,删除条件有多个,需要从页面全部传给后台服务器程序,单个的删除,可以拼接参数给url,服务器端获取参数后执行删除操作即可。但是批量删除多个,参数会很多,传递就有些...

推荐几个好用Redis图形化客户端工具

RedisPlushttps://gitee.com/MaxBill/RedisPlus RedisPlus是为Redis可视化管理开发的一款开源免费的桌面客户端软件,支持Windows 、Linux...

java-socket长连接demo体验(java tcp长连接)

作者:DavidDing 来源:https://zhuanlan.zhihu.com/p/56135195 一、前言最近公司在预研设备app端与服务端的交互方案,主要方案有:服务端和app端通过阿里i...

拒绝接口裸奔!开放API接口签名验证

接口安全问题请求身份是否合法?请求参数是否被篡改?请求是否唯一?AccessKey&SecretKey (开放平台)请求身份为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(...

微服务架构模式:让自己对BFF层有个了解——服务于前端的后端

BFF用于前端的后端◎ 回顾前后端分离发展史◎ BFF诞生◎ 基于RESTful的BFF◎ 基于GraphQL的BFF随着前端技术的大爆发,面对逐渐复杂化的前端工程体系,越来越多的企业开始采用前后端分...

前后端分离的开源在线考试系统调试实战

开篇在我们的教育生涯中,或多或少的都接触过在线考试系统。例如大学里最常见的各种软件考试,上机考试等,那么有没有开源的这样的系统呢?当然是有了,今天就来调试个开源的在线考试系统。本文重点是调试,因为很多...