新手刚入门,正在学习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时,那时没有收到数据,
就执行了解析操作,所以没有解析出来。