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编程问题,不能接收数据,懂的帮忙解答一下,谢谢了。的主要内容,如果未能解决你的问题,请参考以下文章

请教各位高手在Qt中的网络编程中,怎么接收结构体

C# TCP编程 NetworkStream 的大小?

QT tcp 编程 【在线等】

asp.net 用socket接收数据

Socket 编程中 close() 和 shutdown() 有啥区别?

如何用Qt的Qudpsocket传输图片文件?