qt socket编程问题,不能接收数据,懂的帮忙解答一下,谢谢了。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt socket编程问题,不能接收数据,懂的帮忙解答一下,谢谢了。相关的知识,希望对你有一定的参考价值。
////这是发送的函数
void mainWig::sendRequest()
QByteArray block;
QDataStream out(&block,QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_3);
out<<quint16(0)<<tr("HELLO");
out.device()->seek(0);
out<<quint16(block.size()-sizeof(quint16));
if(tcpSocket.write(block))
std::cout<<"tcpsocket.write successful!"<<std::endl;
////这是客户端的接受函数
void client::readClient()
std::cout<<"收到信号,大小为:"<<nextBlockSize<<std::endl;
QString instring=this->readAll();
std::cout<<instring.toStdString()<<std::endl;
QDataStream in(this);
in.setVersion(QDataStream::Qt_5_3);
if(nextBlockSize==0)
if(bytesAvailable()<sizeof(quint16))
std::cout<<"数据暂时为空,"<<"已经接收:"<<bytesAvailable()<<std::endl;
return;
in>>nextBlockSize;
std::cout<<nextBlockSize<<std::endl;
if(bytesAvailable()<nextBlockSize)
std::cout<<"还没有完全接收,"<<"已经接收:"<<bytesAvailable()<<std::endl;
return;
std::cout<<"处理数据"<<std::endl;
QString from;
QString to;
quint8 flag;
in>>from>>to>>flag;
generateRandomTrip(from,to,flag);
QDataStream out(this);
out<<quint16(0xFFFF);
close();
现在的问题是,无论是instring还是bytesAvailable()都是空或者0,也就是说根本没有接收到数据,但是发送的代码就这么点,实在找不出错来。
if(bytesAvailable()<nextBlockSize)这种判断如果不正确,就会return ,但是return 了以后,就再也不会触发
readyRead()的事件了,incomingConnection当然也不行。网上的代码包括书上的示例代码都说这个会重复接收,我实在没理解他是怎么重复接收的,而且看效果他也没有重复接收。
请各位大神帮小弟解答一下,今天搞这个搞了下午了,实在没什么想法。
接收函数内,一开始就readAll(),已经把数据都读取了,所以后面就没有可读数据了,所以后面不用判断bytesAvaliables()。
接收的时候,不要直接接收到QString中。应该先读取一个长度值(quint16),再根据长度值去读取QByteArray,再把读取到的QByteArray放到QString中。然后再判断bytesAvaliables是否还有剩余。有剩余,就再接收长度值+QByteArray。。。。
好吧,了然,不明不白就能运行了,确实是删除第一条就行了。但是第一第的内容其实是我在第二条读不出来的情况下加上去的。现在又可以了。
参考技术A 表示不会用Qt禄socket。。以上是关于qt socket编程问题,不能接收数据,懂的帮忙解答一下,谢谢了。的主要内容,如果未能解决你的问题,请参考以下文章