您的位置:首页 > 理论基础 > 计算机网络

QT开发之TCP(传输文件)

2016-12-11 20:06 423 查看
 上篇博文讲解了局域网内聊天,这篇文章讲解怎么传输文件,文章的代码是参考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_OBJECT

public:
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_OBJECT

public:
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_OBJECT

public:
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          
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: