qt socket编程问题,不能接收数据,懂的帮忙解答一下,谢谢了。
////这是发送的函数voidmainWig::sendRequest(){QByteArrayblock;QDataStreamout(&block,QIODevice...
////这是发送的函数
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当然也不行。网上的代码包括书上的示例代码都说这个会重复接收,我实在没理解他是怎么重复接收的,而且看效果他也没有重复接收。
请各位大神帮小弟解答一下,今天搞这个搞了下午了,实在没什么想法。 展开
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当然也不行。网上的代码包括书上的示例代码都说这个会重复接收,我实在没理解他是怎么重复接收的,而且看效果他也没有重复接收。
请各位大神帮小弟解答一下,今天搞这个搞了下午了,实在没什么想法。 展开
2个回答
2014-06-28
展开全部
接收函数内,一开始就readAll(),橘行颂已经把数据都读取了,所以后面就没有可读数据了,圆郑所以后面不用判断bytesAvaliables()。
接收的时候,不要直接带春接收到QString中。应该先读取一个长度值(quint16),再根据长度值去读取QByteArray,再把读取到的QByteArray放到QString中。然后再判断bytesAvaliables是否还有剩余。有剩余,就再接收长度值+QByteArray。。。。
追问
好吧,了然,不明不白就能运行了,确实是删除第一条就行了。但是第一第的内容其实是我在第二条读不出来的情况下加上去的。现在又可以了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询