void Client::newConn() { blockSize = 0; tClnt->abort(); tClnt->connectToHost(hostAddr, tPort); time.start();//建立好连接后便开始计时 } void Client::readMsg() { QDataStream in(tClnt); in.setVersion(QDataStream::Qt_4_7); float useTime = time.elapsed(); if (bytesReceived <= sizeof(qint64)2){ if((tClnt->bytesAvailable() >= sizeof(qint64)2) && (fileNameSize == 0)) { in >> totalBytes >>fileNameSize; bytesReceived += sizeof(qint64)2; } if((tClnt->bytesAvailable() >= fileNameSize) && (fileNameSize != 0)){ in>>fileName; bytesReceived += fileNameSize; if (!locFile->open(QFile::WriteOnly)){ QMessageBox::warning(this, tr("应 用 程 序"), tr("无法读取文件 %1:\n%2.") .arg(fileName).arg(locFile->errorString())); return; } }else { return; } } if (bytesReceived < totalBytes) { bytesReceived += tClnt->bytesAvailable(); inBlock = tClnt->readAll(); locFile->write(inBlock); inBlock.resize(0); } ui->progressBar->setMaximum(totalBytes); ui->progressBar->setValue(bytesReceived); double speed = bytesReceived / useTime; ui->cStatusLbl->setText(tr("已接收 %1MB (%2MB/s) \n 共%3MB 已用时:%4" "秒\n估计剩余时间:%5秒") .arg(bytesReceived / (10241024)) .arg(speed1000/(10241024), 0, 'f',2) .arg(totalBytes / (1024 * 1024)) .arg(useTime/1000, 0, 'f', 0) .arg(totalBytes/speed/1000 - useTime/1000, 0, 'f', 0)); if(bytesReceived == totalBytes) { locFile->close(); tClnt->close(); ui->cStatusLbl->setText(tr("接收文件 %1 完毕").arg(fileName)); } }
时间: 2024-04-02 14:32:06 浏览: 29
这段代码是关于网络文件下载的,实现了客户端从服务器下载文件并显示下载进度和速度等信息。函数`newConn()`是用于建立连接的,函数`readMsg()`是用于读取文件内容的。其中,`tClnt`是QTcpSocket类型的指针,用于和服务器建立连接和读取数据;`in`是QDataStream类型的对象,用于读取数据;`locFile`是QFile类型的指针,用于保存下载的文件到本地;`totalBytes`和`bytesReceived`是用于记录下载进度的变量;`fileNameSize`和`fileName`是用于记录下载文件的名称和大小的变量;`useTime`和`speed`是用于记录下载所用时间和下载速度的变量。
相关问题
Client::Client(QWidget *parent) : QDialog(parent), ui(new Ui::Client) { ui->setupUi(this); setFixedSize(400, 190); totalBytes = 0; bytesReceived = 0; fileNameSize = 0; tClnt = new QTcpSocket(this); tPort = 6666; connect(tClnt, SIGNAL(readyRead()), this, SLOT(readMsg())); connect(tClnt, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT( displayErr(QAbstractSocket::SocketError))); } Client::~Client() { delete ui; } void Client::setHostAddr(QHostAddress addr) { hostAddr = addr; newConn(); } void Client::setFileName(QString name) { locFile = new QFile(name); } void Client::closeEvent(QCloseEvent *) { on_cCloseBtn_clicked(); }
这是一个基于 QTcpSocket 的客户端程序的部分代码。其中,Client 类继承自 QDialog,表示该程序是一个窗口界面程序。在构造函数中,使用 ui->setupUi(this) 初始化界面,设置窗口大小为 400x190。totalBytes、bytesReceived、fileNameSize 是一些变量,用于记录接收文件时的信息。tClnt 是一个 QTcpSocket 对象,用于与服务器通信。tPort 是服务器端口号。程序使用 connect 函数连接了 tClnt 的 readyRead 信号和 error 信号到相应的槽函数 readMsg 和 displayErr。setHostAddr 函数设置服务器 IP 地址,newConn 函数用于建立与服务器的连接,setFileName 函数用于设置接收到的文件名,closeEvent 函数用于在窗口关闭时执行一些操作。
class QTcpSocket; namespace Ui { class Client; } class Client : public QDialog { Q_OBJECT public: explicit Client(QWidget *parent = 0); ~Client(); void setHostAddr(QHostAddress addr); //获取发送端IP地址 void setFileName(QString name); //获取文件保存路径 protected: void closeEvent(QCloseEvent *); private: Ui::Client *ui; QTcpSocket *tClnt; //客户端套接字类 quint16 blockSize; QHostAddress hostAddr; qint16 tPort; qint64 totalBytes; //总共需接收的字节数 qint64 bytesReceived; //已接收字节数 qint64 fileNameSize; QString fileName; QFile *locFile; //待接收的文件 QByteArray inBlock; //缓存一次接收的数据 QTime time; private slots: void newConn(); //连接到服务器 void readMsg(); //读取文件数据 void displayErr(QAbstractSocket::SocketError sockErr); //显示错误信息 void on_cCancleBtn_clicked(); void on_cCloseBtn_clicked(); };
这是一个用于实现文件传输的客户端程序的类定义。它包含了一些成员函数和变量,用于连接服务器、接收文件数据、显示错误信息等。其中,QTcpSocket类用于创建客户端套接字,QFile类用于接收和保存文件,QHostAddress类用于获取发送端IP地址。这个类的构造函数和析构函数用于创建和释放对象,closeEvent函数用于关闭窗口。其他的函数和变量用于实现具体的功能,如setHostAddr函数用于设置发送端IP地址,setFileName函数用于设置文件保存路径。这个类的实现依赖于Qt库,需要在项目中添加Qt库的头文件和链接库。