QT开发之TCP(传输文件)

来源:互联网 发布:淘宝买家秀福利店铺名 编辑:程序博客网 时间:2024/05/19 02:30

 上篇博文讲解了局域网内聊天,这篇文章讲解怎么传输文件,文章的代码是参考Qt Creator开发手册中的代码.在以后的博文中我会结合这两部分综合开发一个局域网聊天和传输文件的软件.现在只是学习基础,就讲解一些基础的东西了.这段时间太忙了,练车,学校还有一个国家级项目还得做.还得学习Qt和Python.   喘口气的时间都没得了,等这个月忙完了就好了.微笑微笑微笑


就不新建工程了,还是原来的味道,注意在工程文件中添加QT       += network 


client.h

#ifndef CLIENT_H#define CLIENT_H#include <QDialog>#include <QAbstractSocket>class QTcpSocket;class QFile;namespace Ui {    class Client;}class Client : public QDialog{    Q_OBJECTpublic:    explicit Client(QWidget *parent = 0);    ~Client();private:    Ui::Client *ui;    QTcpSocket *tcpClient;    QFile *localFile;    qint64 totalBytes;    qint64 bytesWritten;    qint64 bytesToWrite;    qint64 payloadSize;    QString fileName;    QByteArray outBlock;private slots:    void openFile();    void send();    void startTransfer();    void updateClientProgress(qint64);    void displayError(QAbstractSocket::SocketError);    void on_openButton_clicked();    void on_sendButton_clicked();};#endif // CLIENT_H

client.cpp

#ifndef CLIENT_H#define CLIENT_H#include <QDialog>#include <QAbstractSocket>class QTcpSocket;class QFile;namespace Ui {    class Client;}class Client : public QDialog{    Q_OBJECTpublic:    explicit Client(QWidget *parent = 0);    ~Client();private:    Ui::Client *ui;    QTcpSocket *tcpClient;    QFile *localFile;    qint64 totalBytes;    qint64 bytesWritten;    qint64 bytesToWrite;    qint64 payloadSize;    QString fileName;    QByteArray outBlock;private slots:    void openFile();    void send();    void startTransfer();    void updateClientProgress(qint64);    void displayError(QAbstractSocket::SocketError);    void on_openButton_clicked();    void on_sendButton_clicked();};#endif // CLIENT_H

server.h

#ifndef SERVER_H#define SERVER_H#include <QDialog>#include <QAbstractSocket>#include <QTcpServer>class QTcpSocket;class QFile;namespace Ui {class Server;}class Server : public QDialog{    Q_OBJECTpublic:    explicit Server(QWidget *parent = 0);    ~Server();private:    Ui::Server *ui;    QTcpServer tcpServer;    QTcpSocket *tcpServerConnection;    qint64 totalBytes;    qint64 bytesReceived;    qint64 fileNameSize;    QString fileName;    QFile *localFile;    QByteArray inBlock;private slots:    void start();    void acceptConnection();    void updateServerProgress();    void displayError(QAbstractSocket::SocketError socketError);    void on_startButton_clicked();};#endif // SERVER_H

server.cpp

#include "server.h"#include "ui_server.h"#include <QtNetwork>Server::Server(QWidget *parent) :    QDialog(parent),    ui(new Ui::Server){    ui->setupUi(this);    connect(&tcpServer, SIGNAL(newConnection()),            this, SLOT(acceptConnection()));}Server::~Server(){    delete ui;}void Server::start(){    if (!tcpServer.listen(QHostAddress::LocalHost, 6666)) {        qDebug() << tcpServer.errorString();        close();        return;    }    ui->startButton->setEnabled(false);    totalBytes = 0;    bytesReceived = 0;    fileNameSize = 0;    ui->serverStatusLabel->setText(tr("监听"));    ui->serverProgressBar->reset();}void Server::acceptConnection(){    tcpServerConnection = tcpServer.nextPendingConnection();    connect(tcpServerConnection, SIGNAL(readyRead()),            this, SLOT(updateServerProgress()));    connect(tcpServerConnection, SIGNAL(error(QAbstractSocket::SocketError)),            this, SLOT(displayError(QAbstractSocket::SocketError)));    ui->serverStatusLabel->setText(tr("接受连接"));    tcpServer.close();}void Server::updateServerProgress(){    QDataStream in(tcpServerConnection);    in.setVersion(QDataStream::Qt_4_0);    if (bytesReceived <= sizeof(qint64)*2) {        if((tcpServerConnection->bytesAvailable() >= sizeof(qint64)*2)                && (fileNameSize == 0)) {            in >> totalBytes >> fileNameSize;            bytesReceived += sizeof(qint64) * 2;        }        if((tcpServerConnection->bytesAvailable() >= fileNameSize)                && (fileNameSize != 0)) {            in >> fileName;            ui->serverStatusLabel->setText(tr("接收文件%1 ...")                                           .arg(fileName));            bytesReceived += fileNameSize;            localFile = new QFile(fileName);            if (!localFile->open(QFile::WriteOnly)) {                qDebug() << "server: open file error!";                return;            }        } else {            return;        }    }    if (bytesReceived < totalBytes) {        bytesReceived += tcpServerConnection->bytesAvailable();        inBlock = tcpServerConnection->readAll();        localFile->write(inBlock);        inBlock.resize(0);    }    ui->serverProgressBar->setMaximum(totalBytes);    ui->serverProgressBar->setValue(bytesReceived);    if (bytesReceived == totalBytes) {        tcpServerConnection->close();        localFile->close();        ui->startButton->setEnabled(true);        ui->serverStatusLabel->setText(tr("接受文件 %1 成功")                                       .arg(fileName));    }}void Server::displayError(QAbstractSocket::SocketError socketError){    qDebug() << tcpServerConnection->errorString();    tcpServerConnection->close();    ui->serverProgressBar->reset();    ui->serverStatusLabel->setText(tr("服务端就绪"));    ui->startButton->setEnabled(true);}void Server::on_startButton_clicked(){    start();}

注意在main.cpp中添加QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));防止中文乱码

界面效果如下:



                                                                                                                                                                                             文章出自:Linux_Google          

3 0
原创粉丝点击