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
- QT开发之TCP(传输文件)
- Qt PC 安卓 tcp传输文件
- Qt之TCP、UDP传输模型
- qt学习之路六(QT的tcp传输)
- Qt Tcp传输
- qt TCP传输字符串
- QT开发之TCP协议
- Qt中tcp传输文件遇到的问题
- Qt模块化笔记之network——第二个TCP程序,传输图片文件的实现(1)
- Qt模块化笔记之network——第二个TCP程序,传输图片文件的实现(2)
- Qt模块化笔记之network——第二个TCP程序,传输图片文件的实现(2)
- <Qt>实例:TCP网络传输
- Tcp传输文件
- python TCP传输文件
- Linux网络编程之使用TCP传输文件
- Linux网络编程之使用TCP传输文件
- Linux网络编程之使用TCP传输文件
- Linux网络编程之使用TCP传输文件
- Android Studio中Module的build.gradle详解
- Android开发艺术探索<Drawable系列之六ClipDrawabe >
- 软件工程--计划阶段
- 2016/12/10 Test Note
- PostgreSQL 教程 -part1 SQL语言
- QT开发之TCP(传输文件)
- Android studio中的常用快捷键
- 显试意图&隐试意图
- Web前段分析之 ----文本压缩和其他
- wifi mac帧内容
- Python 的文件IO相关操作说明
- 【C#总结】-转折点
- SSH进阶(5)——Struts2对异常支持
- UWP滑动手势