• 4996阅读
  • 2回复

[提问]求助QTcpSocket的问题 [复制链接]

上一主题 下一主题
离线七寸
 
只看楼主 倒序阅读 楼主  发表于: 2012-05-22
关键词: 求助线程部分
客户端部分代码如下
这是一个接收线程,在main()中启动,当服务器发送消息做出接收
void receiverThread::run()
{
      tcpSocket=new QTcpSocket;
      tcpSocket.connectToHost("127.0.0.1",12345);
      while(true)
      {
             qDebug()<<tcpSocket->socketDescriptor();
             qDebug()<<tcpSocket->ConnectedState;
             if(tcpSocket->isVaild())
                     qDebug()<<"true";
             receiveMessage(tcpSocket);
      }
}
void receiverThread::receiveMessage(QTcpSocket *tcpSocket)
{
       while(tcpSocket->bytesAvailable()<(int)sizeof(qint16))  //在服务器端定义的消息总长度
       {
               if(!tcpSocket->waitForReadyRead(5000))
                        return;
       }
       QByteArray inBlock=tcpSocket->readAll();
       QDataStream in (inBlock);
       in>>TotalBytes;//读消息总长
       in>>message;
       emit newMessage(message);
}

我遇到的问题是这样只能接收一次服务器发来的消息,之后qDebug一直打印出下列三行的循环
-1 //socketDescriptor
QAbstractSocket::ConnectedState
true


我的问题是我没有释放socket,为何tcpSocket->socketDescriptor()会变成-1,而tcpSocket->ConnectedState仍然处于连接状态,
tcpSocket->isVaild()返回的也是true??











离线七寸
只看该作者 1楼 发表于: 2012-05-22
求大大指点,我知道当把socket的建立放在while的循环里面的时候是可以实现多次接收的,但是这样我做发送线程会有点小问题,我还是希望能以长连接的情况实现通信
离线caploveleo
只看该作者 2楼 发表于: 2013-03-22
回 楼主(七寸) 的帖子
run函数中的死循环一直死循环一直占用cpu,线程没有进入事件循环======
可以这样操作,建立连接后,connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(receiveMessage());,然后执行exec进入事件循环,注意receiveMessage槽函数写正确,这样应该就可以多次接收了
快速回复
限100 字节
 
上一个 下一个