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当然也不行。网上的代码包括书上的示例代码都说这个会重复接收,我实在没理解他是怎么重复接收的,而且看效果他也没有重复接收。
请各位大神帮小弟解答一下,今天搞这个搞了下午了,实在没什么想法。
展开
 我来答
匿名用户
2014-06-28
展开全部
  1.   接收函数内,一开始就readAll(),已经把数据都读取了,所以后面就没有可读数据了,所以后面不用判断bytesAvaliables()。

  2. 接收的时候,不要直接接收到QString中。应该先读取一个长度值(quint16),再根据长度值去读取QByteArray,再把读取到的QByteArray放到QString中。然后再判断bytesAvaliables是否还有剩余。有剩余,就再接收长度值+QByteArray。。。。

追问
好吧,了然,不明不白就能运行了,确实是删除第一条就行了。但是第一第的内容其实是我在第二条读不出来的情况下加上去的。现在又可以了。
a996232762
2014-06-27 · TA获得超过307个赞
知道答主
回答量:210
采纳率:0%
帮助的人:74万
展开全部
表示不会用Qt禄socket。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式