#ifndef CLIENTWIDGET_H
#define CLIENTWIDGET_H
#include <QWidget>
#include <QTcpSocket>
#include <QFile>
namespace Ui {
class ClientWidget;
}
class ClientWidget : public QWidget
{
Q_OBJECT
public:
explicit ClientWidget(QWidget *parent = nullptr);
~ClientWidget();
private slots:
void on_buttonConnect_clicked();
private:
Ui::ClientWidget *ui;
QTcpSocket *tcpSocket;
QFile file;
QString fileName;
qint64 fileSize;
qint64 recvSize;
bool isStart;
};
#endif
#ifndef SEVERWIDGET_H
#define SEVERWIDGET_H
#include <QWidget>
#include <QTcpServer>
#include <QTcpSocket>
#include <QFile>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui {
class SeverWidget; }
QT_END_NAMESPACE
class SeverWidget : public QWidget
{
Q_OBJECT
public:
SeverWidget(QWidget *parent = nullptr);
~SeverWidget();
void sendData();
private slots:
void on_buttonFile_clicked();
void on_buttonSend_clicked();
private:
Ui::SeverWidget *ui;
QTcpServer *tcpServer;
QTcpSocket *tcpSocket;
QFile file;
QString fileName;
qint64 fileSize;
qint64 sendSize;
QTimer timer;
};
#endif
#include "clientwidget.h"
#include "ui_clientwidget.h"
#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);
connect(tcpSocket,&QTcpSocket::readyRead,
[=](){
QByteArray buf = tcpSocket->readAll();
if(true == isStart )
{
isStart = false;
fileName = QString(buf).section("##",0,0);
fileSize = QString(buf).section("##",1,1).toInt();
recvSize = 0;
file.setFileName(fileName);
file.open(QIODevice::WriteOnly);
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(fileSize/1024);
ui->progressBar->setValue(0);
}
else{
qint64 len = file.write(buf);
recvSize += len;
ui->progressBar->setValue(recvSize/1024);
if(recvSize == fileSize)
{
file.close();
QMessageBox::information(this,"完成","文件接收完成");
}
}
}
);
}
ClientWidget::~ClientWidget()
{
delete ui;
}
void ClientWidget::on_buttonConnect_clicked()
{
QString ip = ui->lineEditIP->text();
quint16 port = ui->lineEditPort->text().toInt();
tcpSocket->connectToHost(QHostAddress(ip),port);
}
#include "severwidget.h"
#include "ui_severwidget.h"
#include <QHostAddress>
#include <QFileDialog>
#include <QFileInfo>
SeverWidget::SeverWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::SeverWidget)
{
ui->setupUi(this);
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::Any,8888);
setWindowTitle("服务器端口:8888");
ui->buttonFile->setEnabled(false);
ui->buttonSend->setEnabled(false);
connect(tcpServer,&QTcpServer::newConnection,
[=](){
tcpSocket = tcpServer->nextPendingConnection();
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(&timer,&QTimer::timeout,
[=](){
timer.stop();
sendData();
}
);
}
SeverWidget::~SeverWidget()
{
delete ui;
}
void SeverWidget::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);
file.open(QIODevice::ReadOnly);
ui->textEdit->append(filepath);
ui->buttonFile->setEnabled(false);
ui->buttonSend->setEnabled(true);
}
}
void SeverWidget::on_buttonSend_clicked()
{
QString head = QString("%1##%2").arg(fileName).arg(fileSize);
qint64 len = tcpSocket->write(head.toUtf8());
if(len > 0 )
{
timer.start(20);
}
else
{
file.close();
ui->buttonFile->setEnabled(true);
ui->buttonSend->setEnabled(false);
}
}
void SeverWidget::sendData()
{
qint64 len = 0;
do
{
char buf[4*1024] = {
0};
len = 0;
len = file.read(buf,sizeof(buf));
tcpSocket->write(buf,len);
sendSize += len;
}while(len > 0);
if(sendSize == fileSize)
{
ui->textEdit->append("文件发送完毕");
file.close();
}
}