日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt下Tcp传输文件

發布時間:2024/4/11 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt下Tcp传输文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Qt下Tcp傳輸文件

文章目錄

    • Qt下Tcp傳輸文件
    • 1.服務端
    • 2.客戶端

1.服務端

//ServerWidgets.h #ifndef SERVERWIDGET_H #define SERVERWIDGET_H#include <QWidget> #include <QTcpServer> //監聽套接字 #include <QTcpSocket> //通信套接字 #include <QFile> #include <QTimer>namespace Ui { class ServerWidget; }class ServerWidget : public QWidget {Q_OBJECTpublic:explicit ServerWidget(QWidget *parent = 0);~ServerWidget();void sendData(); //發送文件數據private slots:void on_buttonFile_clicked();void on_buttonSend_clicked();private:Ui::ServerWidget *ui;QTcpServer *tcpServer; //監聽套接字QTcpSocket *tcpSocket; //通信套接字QFile file; //文件對象QString fileName; //文件名字qint64 fileSize; //文件大小qint64 sendSize; //已經發送文件的大小QTimer timer; //定時器};//ServerWidgets.cpp #endif // SERVERWIDGET_H #include "serverwidget.h" #include "ui_serverwidget.h" #include <QFileDialog> #include <QDebug> #include <QFileInfo>ServerWidget::ServerWidget(QWidget *parent) :QWidget(parent),ui(new Ui::ServerWidget) {ui->setupUi(this);//監聽套接字tcpServer = new QTcpServer(this);//監聽tcpServer->listen(QHostAddress::Any, 8888);setWindowTitle("服務器端口為:8888");//兩個按鈕都不能按ui->buttonFile->setEnabled(false);ui->buttonSend->setEnabled(false);//如果客戶端成功和服務器連接//tcpServer會自動觸發 newConnection()connect(tcpServer, &QTcpServer::newConnection,[=](){//取出建立好連接的套接字tcpSocket = tcpServer->nextPendingConnection();//獲取對方的ip和端口QString ip = tcpSocket->peerAddress().toString();quint16 port = tcpSocket->peerPort();QString str = QString("[%1:%2] 成功連接").arg(ip).arg(port);ui->textEdit->setText(str); //顯示到編輯區//成功連接后,才能按選擇文件ui->buttonFile->setEnabled(true);connect(tcpSocket, &QTcpSocket::readyRead,[=](){//取客戶端的信息QByteArray buf = tcpSocket->readAll();if(QString(buf) == "file done"){//文件接收完畢ui->textEdit->append("文件發送完畢");file.close();//斷開客戶端端口tcpSocket->disconnectFromHost();tcpSocket->close();}});});connect(&timer, &QTimer::timeout,[=](){//關閉定時器timer.stop();//發送文件sendData();});}ServerWidget::~ServerWidget() {delete ui; }//選擇文件的按鈕 void ServerWidget::on_buttonFile_clicked() {QString filePath = QFileDialog::getOpenFileName(this, "open", "../");if(false == filePath.isEmpty()) //如果選擇文件路徑有效{fileName.clear();fileSize = 0;//獲取文件信息QFileInfo info(filePath);fileName = info.fileName(); //獲取文件名字fileSize = info.size(); //獲取文件大小sendSize = 0; //發送文件的大小//只讀方式打開文件//指定文件的名字file.setFileName(filePath);//打開文件bool isOk = file.open(QIODevice::ReadOnly);if(false == isOk){qDebug() << "只讀方式打開文件失敗 106";}//提示打開文件的路徑ui->textEdit->append(filePath);ui->buttonFile->setEnabled(false);ui->buttonSend->setEnabled(true);}else{qDebug() << "選擇文件路徑出錯 118";}} //發送文件按鈕 void ServerWidget::on_buttonSend_clicked() {ui->buttonSend->setEnabled(false);//先發送文件頭信息 文件名##文件大小QString head = QString("%1##%2").arg(fileName).arg(fileSize);//發送頭部信息qint64 len = tcpSocket->write( head.toUtf8() );if(len > 0)//頭部信息發送成功{//發送真正的文件信息//防止TCP黏包//需要通過定時器延時 20 mstimer.start(20);}else{qDebug() << "頭部信息發送失敗 142";file.close();ui->buttonFile->setEnabled(true);ui->buttonSend->setEnabled(false);} }void ServerWidget::sendData() {ui->textEdit->append("正在發送文件……");qint64 len = 0;do{//每次發送數據的大小char buf[4*1024] = {0};len = 0;//往文件中讀數據len = file.read(buf, sizeof(buf));//發送數據,讀多少,發多少len = tcpSocket->write(buf, len);//發送的數據需要累積sendSize += len;}while(len > 0);// //是否發送文件完畢 // if(sendSize == fileSize) // { // ui->textEdit->append("文件發送完畢"); // file.close();// //把客戶端端口 // tcpSocket->disconnectFromHost(); // tcpSocket->close(); // }}

2.客戶端

//ClientWidgets.h #ifndef CLIENTWIDGET_H #define CLIENTWIDGET_H#include <QWidget> #include <QTcpSocket> #include <QFile>namespace Ui { class ClientWidget; }class ClientWidget : public QWidget {Q_OBJECTpublic:explicit ClientWidget(QWidget *parent = 0);~ClientWidget();private slots:void on_buttonConnect_clicked();private:Ui::ClientWidget *ui;QTcpSocket *tcpSocket;QFile file; //文件對象QString fileName; //文件名字qint64 fileSize; //文件大小qint64 recvSize; //已經接收文件的大小bool isStart; //標志位,是否為頭部信息 };#endif // CLIENTWIDGET_H//ClientWidgets.cpp #include "clientwidget.h" #include "ui_clientwidget.h" #include <QDebug> #include <QMessageBox> #include <QHostAddress>ClientWidget::ClientWidget(QWidget *parent) :QWidget(parent),ui(new Ui::ClientWidget) {ui->setupUi(this);tcpSocket = new QTcpSocket(this);isStart = true;ui->progressBar->setValue(0); //當前值setWindowTitle("客戶端");connect(tcpSocket, &QTcpSocket::readyRead,[=](){//取出接收的內容QByteArray buf = tcpSocket->readAll();if(true == isStart){//接收頭isStart = false;//解析頭部信息 QString buf = "hello##1024"// QString str = "hello##1024#mike";// str.section("##", 0, 0)//初始化//文件名fileName = QString(buf).section("##", 0, 0);//文件大小fileSize = QString(buf).section("##", 1, 1).toInt();recvSize = 0; //已經接收文件大小//打開文件//關聯文件名字file.setFileName(fileName);//只寫方式方式,打開文件bool isOk = file.open(QIODevice::WriteOnly);if(false == isOk){qDebug() << "WriteOnly error 49";tcpSocket->disconnectFromHost(); //斷開連接tcpSocket->close(); //關閉套接字return; //如果打開文件失敗,中斷函數}//彈出對話框,顯示接收文件的信息QString str = QString("接收的文件: [%1: %2kb]").arg(fileName).arg(fileSize/1024);QMessageBox::information(this, "文件信息", str);//設置進度條ui->progressBar->setMinimum(0); //最小值ui->progressBar->setMaximum(fileSize/1024); //最大值ui->progressBar->setValue(0); //當前值}else //文件信息{qint64 len = file.write(buf);if(len >0) //接收數據大于0{recvSize += len; //累計接收大小qDebug() << len;}//更新進度條ui->progressBar->setValue(recvSize/1024);if(recvSize == fileSize) //文件接收完畢{//先給服務發送(接收文件完成的信息)tcpSocket->write("file done");QMessageBox::information(this, "完成", "文件接收完成");file.close(); //關閉文件//斷開連接tcpSocket->disconnectFromHost();tcpSocket->close();}}});}ClientWidget::~ClientWidget() {delete ui; }void ClientWidget::on_buttonConnect_clicked() {//獲取服務器的ip和端口QString ip = ui->lineEditIP->text();quint16 port = ui->lineEditPort->text().toInt();//主動和服務器連接tcpSocket->connectToHost(QHostAddress(ip), port);isStart = true;//設置進度條ui->progressBar->setValue(0); }

總結

以上是生活随笔為你收集整理的Qt下Tcp传输文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。