先说明一下我的接收发送是放在线程池里的
1
write()函数数据不发送 (),这个不发送是指我循环执行write()函数,退出循环后我的数据依然在缓冲区,后续也没把数据发送出去。
先说我发现的一个会导致这个现象的原因,write()写在槽函数里面(可能和我socket放在线程池里有关)。
解决办法的话 别写在槽函数里就行了,使用waitForBytesWritten(),或者flush()也可以。waitForBytesWritten()会随机失败,这个要注意一下。
2
传完图片的时候,断开了和readyRead()信号的连接,准备退出线程的时候(我用了事件循环和线程池,传输完的时候调用了quit()),还是调用了槽函数,导致程序异常退出。这个问题挺随机的,概率触发。(可能描述的不太准确,有错请指出)
槽函数开头写了一个判断,图片传输完了直接return()(我也是不是很懂为什么这样可以,就是我发现每次出现这个问题的时候,槽函数能执行我开头的一条qDebug()输出,然后程序崩溃,所以试了一下)。
这个应该是我线程使用的不对导致,大家可以忽略
3
接收数据的时候数据丢失,执行read()或 readAll()读取数据的时候卡住,调试时提示段错误,导致程序未响应。
目前已经找到了原因所在,是我使用线程方面有问题导致的。
这个没有解决,如果有知道怎么请告诉我,谢谢!谢谢!谢谢!
找了好久一直以为是接收或者发送的逻辑出错了,后来发现是线程问题。现在终于发现了问题所在
connect(socket,&QTcpSocket::readyRead,this,[this,socket](){
this->recework(socket);
});
这是我的连接函数,这个this就是问题所在。工作类是属于主线程的,那么这里用this的话根据qt默认的连接方式,这个匿名函数就会在主线程执行。所以只要将连接方式改为
Qt::DirectConnection或者将this去掉也是可以的。
4
我把我的项目发给我同学测试传图片功能的时候出现了头数据错误的情况(10次会出现8次)。
我的头数据是由文件信息大小+文件信息+文件大小组成的,在我判断连接服务器成功后就会开始打开文件发送数据,下面是我解数据的代码(分开接收也可以,虽然照样会有头数据出错的现象,我是局域网的就直接全部读进来)
stream>>filenameInformation_size>>fileInformationT>>file_size;
读出来的数据是 很大的 随机数+""+很大的随机数
我的解决办法是 在发送头数据前 用QThread::msleep(20)阻塞了一下线程当前线程我是20ms,然后发送完头数据也阻塞20ms。
我也不清楚为什么加了两个阻塞了之后就可以了,因为如果是数据发太快的导致的话,我本机上应该更容易出现这个问题才对,可是我本机上出现问题的概率比较低。如果有知道的请告知,谢谢。