当前位置: 代码迷 >> QT开发 >> Qmessagebox影响了QTcpSocket的读取,一个莫名其妙又有意思的有关问题
  详细解决方案

Qmessagebox影响了QTcpSocket的读取,一个莫名其妙又有意思的有关问题

热度:89   发布时间:2016-04-25 03:14:59.0
Qmessagebox影响了QTcpSocket的读取,一个莫名其妙又有意思的问题
本帖最后由 shihoongbo 于 2014-08-04 16:26:51 编辑
新手刚入门,正在学习Tcp通信
写了一个简单的客户端QTcpSocket向服务端QTcpServer发送字符串的小程序
最后在客户端接受套接字的时候出了个很有意思的问题,一直没明白其中的错误

BUG最后跟踪调试,出现在了服务器端的槽函数里
贴关键代码(槽)

void server::txtshow()
{
    //QMessageBox::information(this,"待用区","成功接收客户端数据","返回");

    QString str;
    buffer=listener->nextPendingConnection();
    QDataStream in(buffer);
    in.setVersion(QDataStream::Qt_4_8);
 
   block=0;
        if (block==0)
            {
            qDebug()<<buffer->bytesAvailable()<<endl;

            if (buffer->bytesAvailable()<(int)sizeof(quint16))  return;
                in>>block;
            }
        if (buffer->bytesAvailable()<block) return;
            in>>str;

    qDebug()<<str<<endl;
    return ;
}

客户端是用QDataStream发送一个字符串;

服务器端的QTcpServer监听到了信号newConnection()然后执行到了这个txtshow()槽函数,开始解析套接字

中间一段10行-19行是不少Qt文档文献里的代码,拿过来改了一下用的

然后运行的时候就出现了这个问题
txtshow()槽函数的开头有一个QMessageBox,本意是做一个提示。这样运行最后确实得到了客户端传来的字符串。

但是我把QMessageBox给注释掉再编译运行之后,怪事发生了,没有解析出来字符串!

为此做了个跟踪,添加了一行qDebug()<<buffer->bytesAvailable()<<endl;
然后再运行,发现没有QMessageBox的时候,buffer->bytesAvailabel()居然是0!
但是加上QMessageBox之后,buffer->bytesAvailabel()返回的就是正常的字符长度

弄了半天也不知道倒底是哪里出错,想想看,可能是中间那段套接字解析有问题
求大神帮忙解答
------解决方案--------------------
问题出在你自己的代码中。newConnection() 代表有socket连接,但是并不代表该socket有数据,你应该在收到数据时 读取数据。
------解决方案--------------------
1楼说得有道理,我猜你使用QMessageBox后能解析到数据,应该是这样的,因为QMessageBox是阻塞的。
可能刚好阻塞的那点时间,收到数据了,然后接解析出来了。而你没有用QMessageBox时,那时没有收到数据,
就执行了解析操作,所以没有解析出来。