在服务器端的mainwidget中直接调用子线程的recvfile函数,函数如下void work::recvwork() { file = new QFile("snum.txt"); qDebug()<<"文件创建成功"; connect(m_tcp,&QTcpSocket::readyRead,this,[=](){ file->open(QFile::WriteOnly); int count = 0; static int total = 0; if(count == 0) { m_tcp->read((char*)&total,4); } //读出剩余的数据 QByteArray all = m_tcp->readAll(); count += all.size(); file->write(all); qDebug()<<"count"<<count; qDebug()<<"total"<<count; if(count == total) { qDebug()<<"接收数据完成"; //m_tcp->close(); //m_tcp->deleteLater(); file->close(); //file->deleteLater(); qDebug()<<"数据读取完成!"; //emit connectNG(); emit transmitOK(); } }); };
时间: 2024-04-08 08:34:03 浏览: 73
RecvFile.rar_UM_RECVFILE winsock
这段代码是一个槽函数 `recvwork()`,用于在子线程中接收文件数据。下面是代码的解释:
```cpp
void work::recvwork()
{
file = new QFile("snum.txt"); // 创建一个文件对象,用于保存接收的文件数据
qDebug()<<"文件创建成功";
connect(m_tcp, &QTcpSocket::readyRead, this, [=](){
file->open(QFile::WriteOnly); // 打开文件以写入接收的数据
int count = 0; // 计数已接收的数据大小
static int total = 0; // 总共要接收的数据大小,这里使用静态变量,只在第一次读取时有效
if(count == 0)
{
m_tcp->read((char*)&total, 4); // 从套接字中读取总共要接收的数据大小
}
// 读出剩余的数据
QByteArray all = m_tcp->readAll(); // 从套接字中读取所有剩余的数据
count += all.size(); // 更新已接收的数据大小
file->write(all); // 写入文件
qDebug()<<"count"<<count;
qDebug()<<"total"<<count;
if(count == total)
{
qDebug()<<"接收数据完成";
file->close(); // 关闭文件
qDebug()<<"数据读取完成!";
emit transmitOK(); // 发送信号,表示数据接收完成
}
});
}
```
这段代码中,首先创建了一个名为 `file` 的 `QFile` 对象,用于保存接收到的文件数据。然后,通过连接 `QTcpSocket` 的 `readyRead` 信号,当套接字缓冲区中有数据可读时,触发 `lambda` 表达式中的代码。
在 `lambda` 表达式中,先通过 `m_tcp->read((char*)&total, 4);` 从套接字中读取总共要接收的数据大小,然后使用 `m_tcp->readAll()` 读取所有剩余的数据,并将其写入文件。计算已接收的数据大小 `count` 并与总大小 `total` 进行比较,如果相等,则表示数据接收完成。
最后,关闭文件并发出 `transmitOK()` 信号,通知其他部分数据读取完成。
请注意,这段代码只展示了子线程中接收文件的逻辑,并没有包含子线程的创建和启动部分。在主界面的 `mainwidget` 函数中,你需要创建一个 `work` 对象,并通过调用 `QThread::start()` 方法来启动子线程。
阅读全文