新创建的线程中QTcpsocket不能接收数据?

CrazyWind 2012-03-16 06:27:06
QT Examples 中的例子
void FortuneServer::incomingConnection(int socketDescriptor)
{
QString fortune = fortunes.at(qrand() % fortunes.size());
FortuneThread *thread = new FortuneThread(socketDescriptor, fortune, this);
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
thread->start();
}

void FortuneThread::run()
{
QTcpSocket tcpSocket;
if (!tcpSocket.setSocketDescriptor(socketDescriptor)) {
emit error(tcpSocket.error());
return;
}

// 这里tcpSocket貌似不能接收数据
while (true) {
qDebug() << tcpSocket.bytesAvailable(); //输出总为0,客户端确实在不停发数据
if (tcpSocket.bytesAvailable() > 0) {
// tcpSocket.read((char *)&data, sizeof(data));
break;
}
}

// 但是下面的数据能发送给客户端,不知道为什么啊,盼好心人指点,感激不尽啊!
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << text;
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));

tcpSocket.write(block);
tcpSocket.disconnectFromHost();
tcpSocket.waitForDisconnected();
}
...全文
719 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CrazyWind 2012-03-19
  • 打赏
  • 举报
回复
问题解决了
if (tcpSocket.waitForReadyRead(3000)) {
qDebug() <<tcpSocket.readAll();
}
再次感谢!
CrazyWind 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xiachm 的回复:]
C/C++ code

if (tcpSocket.readyRead())
{
qDebug().tcpSocket.readAll();
}


这是阻塞写法。
[/Quote]

readyRead()返回类型是void,还是不能读数据啊,qDebug() << tcpSocket.errorString();输出了Unknown Error,另外exec是在run()方法中调用吗?
CrazyWind 2012-03-19
  • 打赏
  • 举报
回复
非常感谢!
xiachm 2012-03-19
  • 打赏
  • 举报
回复

if (tcpSocket.readyRead())
{
qDebug().tcpSocket.readAll();
}

这是阻塞写法。
xiachm 2012-03-19
  • 打赏
  • 举报
回复
当然不行了,你没调用QThread的exec方法使线程进入事件循环。你的槽函数是不可能被激发的。不过我并不建议你使用信号和槽的方式,没毕要。使用阻塞的方式就行。
CrazyWind 2012-03-19
  • 打赏
  • 举报
回复
connect(&tcpSocket,SIGNAL(readyReady()),this,SLOT(readData()));添加这行还是没用啊,如果不用线程的话就能收到数据
xiachm 2012-03-19
  • 打赏
  • 举报
回复
哈哈,是我的错,手误了,手误了…………
xiachm 2012-03-16
  • 打赏
  • 举报
回复
使用readyRead方法检查数据是否已到达。

16,237

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧