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
就不新建工程了,还是原来的味道,注意在工程文件中添加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
相关文章推荐
- Qt模块化笔记之network——第二个TCP程序,传输图片文件的实现(2)
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- qt4 tcp QTcpSocket QTcpServer 传输文件
- Qt PC 安卓 tcp传输文件
- Qt中tcp传输文件遇到的问题
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- Qt模块化笔记之network——第二个TCP程序,传输图片文件的实现(2)
- qt4 tcp QTcpSocket QTcpServer 传输文件
- QT实现TCP断点传输文件
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- NVIDIA Jetson TX1 系列开发教程之十一:TCP/IP文件传输
- Qt模块化笔记之network——第二个TCP程序,传输图片文件的实现(1)
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- Android开发:如何实现TCP和UDP传输
- Android开发:如何实现TCP和UDP传输
- Android开发:如何实现TCP和UDP传输
- 【转】Qt TCP协议 传输简单字符串实例
- Linux C编程连载【4】-基于TCP/IP的文件传输系统
- 我的WCF开发框架简化版及基于NET.TCP传输方式的实现
- Linux下基于TCP的文件传输