TCP传文件:
QTcpServer:监听套接字
QTcpSocket:通信套接字
在第一行后加上network
客户端头文件client.h:
#ifndef CLIENT_H
#define CLIENT_H
#include <QDialog>
#include<QTcpSocket>
#include<QKeyEvent>
#include<QFile>
#include<QFileDialog>
#include<QTimer>
namespace Ui
{
class Client;
}
class Client : public QDialog
{
Q_OBJECT
public:
explicit Client(QWidget
*parent
= nullptr);
~Client();
void SendData();
private slots
:
void on_pushButtonCONNECT_clicked();
void on_pushButtonCLOSE_clicked();
void on_pushButtonSEND_clicked();
void on_pushButtonCHOOSE_clicked();
private:
Ui
::Client
*ui
;
QTcpSocket
*tcpsocket
;
QFile file
;
QString FileName
;
qint64 FileSize
;
bool isTXT
=true;
QTimer timer
;
qint64 SendSize
=0;
QString Filestyle
;
bool isStart
;
qint64 ReSize
;
protected:
};
#endif
服务器端头文件server.h:
#ifndef SERVER_H
#define SERVER_H
#include<QPainter>
#include <QWidget>
#include<QTcpServer>
#include<QTcpSocket>
#include<QFile>
#include<QFileDialog>
#include<QTimer>
QT_BEGIN_NAMESPACE
namespace Ui
{ class Server; }
QT_END_NAMESPACE
class Server : public QWidget
{
Q_OBJECT
public:
Server(QWidget
*parent
= nullptr);
~Server();
void SendData();
private:
Ui
::Server
*ui
;
QTcpServer
*tcpserver
;
QTcpSocket
*tcpsocket
;
bool isStart
;
QTimer timer
;
QFile file
;
QString FileName
;
qint64 FileSize
;
qint64 ReSize
;
QString Filestyle
;
bool isTXT
=true;
qint64 SendSize
=0;
protected:
void paintEvent(QPaintEvent
*);
private slots
:
void on_pushButtonChoose_clicked();
void on_pushButtonSend_clicked();
};
#endif
客户端源代码client.cpp:
#include "client.h"
#include "ui_client.h"
#include<QHostAddress>
#include<QMessageBox>
#include<QtDebug>
Client
::Client(QWidget
*parent
) :
QDialog(parent
),
ui(new Ui
::Client
)
{
ui
->setupUi(this);
tcpsocket
=new QTcpSocket(this);
setWindowTitle("客户端");
ui
->pushButtonSEND
->setEnabled(false);
ui
->pushButtonCHOOSE
->setEnabled(false);
ui
->pushButtonCLOSE
->setEnabled(false);
connect(tcpsocket
,&QTcpSocket
::connected
,
[=]()
{
ui
->textEditRead
->append("连接成功");
ui
->pushButtonCONNECT
->setText("已连接");
ui
->pushButtonCONNECT
->setEnabled(false);
ui
->pushButtonSEND
->setEnabled(true);
ui
->pushButtonCHOOSE
->setEnabled(true);
ui
->pushButtonCLOSE
->setEnabled(true);
});
connect(tcpsocket
,&QTcpSocket
::readyRead
,
[=]()
{
QByteArray array
=tcpsocket
->readAll();
if(isStart
==true)
{
QString juge
=QString(array
).section("##",0,0);
if(juge
!="FILE"||juge
==NULL)
{
ui
->textEditRead
->append("对方:"+array
);
}
else
{
isStart
=false;
FileName
=QString(array
).section("##",1,1);
FileSize
=QString(array
).section("##",2,2).toInt();
ReSize
=0;
file
.setFileName(FileName
);
bool isOk
=file
.open(QIODevice
::WriteOnly
);
if(isOk
==false)
{
qDebug()<<"文件打开失败";
}
}
}
else
{
qint64 len
=file
.write(array
);
ReSize
+=len
;
if(ReSize
==FileSize
)
{
file
.close();
ui
->textEditRead
->append(FileName
+"文件接收成功");
QMessageBox
::information(this,"成功","文件接收成功");
}
}
});
connect(&timer
,&QTimer
::timeout
,
[=]()
{
timer
.stop();
SendData();
});
}
Client
::~Client()
{
delete ui
;
}
void Client
::on_pushButtonCONNECT_clicked()
{
QString ip
=ui
->lineEditIP
->text();
quint16 port
=ui
->lineEditPORT
->text().toUInt();
tcpsocket
->connectToHost(QHostAddress(ip
),port
);
}
void Client
::on_pushButtonCLOSE_clicked()
{
tcpsocket
->disconnectFromHost();
QMessageBox
::information(this,"disconnected","连接已断开");
ui
->pushButtonCONNECT
->setText("连接");
ui
->pushButtonCLOSE
->setEnabled(false);
ui
->pushButtonCONNECT
->setEnabled((true));
}
void Client
::on_pushButtonSEND_clicked()
{
if(isTXT
==true)
{
QString str
=ui
->textEditWrite
->toPlainText();
tcpsocket
->write(str
.toUtf8());
ui
->textEditRead
->append("我: "+str
);
}
else
{
QString head
=QString("%0##%1##%2").arg(Filestyle
).arg(FileName
).arg(FileSize
);
qint64 len
=tcpsocket
->write(head
.toUtf8());
if(len
>0)
{
timer
.start(20);
}
else
{
qDebug()<<"头部文件发送失败";
file
.close();
}
}
ui
->textEditWrite
->clear();
isTXT
=true;
}
void Client
::SendData()
{
qint64 len
=0;
do
{
char buf
[4*1024]={0};
len
=0;
len
=file
.read(buf
,sizeof(buf
));
len
=tcpsocket
->write(buf
,len
);
SendSize
+=len
;
}while(len
>0);
if(SendSize
==FileSize
)
{
ui
->textEditRead
->append(FileName
+" 文件发送完毕");
file
.close();
}
}
void Client
::on_pushButtonCHOOSE_clicked()
{
QString filePath
=QFileDialog
::getOpenFileName(this,"open","../");
if(filePath
.isEmpty()==false)
{
Filestyle
="FILE";
FileName
.clear();
FileSize
=0;
QFileInfo
info(filePath
);
FileName
=info
.fileName();
FileSize
=info
.size();
file
.setFileName(filePath
);
bool openOk
=file
.open(QIODevice
::ReadOnly
);
if(openOk
==false)
{
QMessageBox
::information(this,"error","以只读方式打开失败");
return;
}
isTXT
=false;
ui
->textEditWrite
->setText(FileName
);
}
else
{
QMessageBox
::information(this,"error","路径无效");
}
}
服务器端源代码server.cpp:
#include "server.h"
#include "ui_server.h"
#include<QPen>
#include<QHostAddress>
#include<QMessageBox>
Server
::Server(QWidget
*parent
)
: QWidget(parent
)
, ui(new Ui
::Server
)
{
ui
->setupUi(this);
setWindowTitle("服务器 007");
tcpserver
=new QTcpServer(this);
tcpserver
->listen(QHostAddress
::Any
,007);
ui
->pushButtonSend
->setEnabled(false);
ui
->pushButtonChoose
->setEnabled(false);
isStart
=true;
connect(tcpserver
,&QTcpServer
::newConnection
,
[=]()
{
tcpsocket
=tcpserver
->nextPendingConnection();
ui
->textEditRead
->setText("连接成功");
ui
->pushButtonSend
->setEnabled(true);
ui
->pushButtonChoose
->setEnabled(true);
connect(tcpsocket
,&QTcpSocket
::readyRead
,
[=]()
{
QByteArray array
=tcpsocket
->readAll();
if(isStart
==true)
{
QString juge
=QString(array
).section("##",0,0);
if(juge
!="FILE"||juge
==NULL)
{
ui
->textEditRead
->append("对方:"+array
);
}
else
{
isStart
=false;
FileName
=QString(array
).section("##",1,1);
FileSize
=QString(array
).section("##",2,2).toInt();
ReSize
=0;
file
.setFileName(FileName
);
bool isOk
=file
.open(QIODevice
::WriteOnly
);
if(isOk
==false)
{
qDebug()<<"文件打开失败";
}
}
}
else
{
qint64 len
=file
.write(array
);
ReSize
+=len
;
if(ReSize
==FileSize
)
{
file
.close();
ui
->textEditRead
->append(FileName
+"文件接收成功");
QMessageBox
::information(this,"成功","文件接收成功");
}
}
});
});
connect(&timer
,&QTimer
::timeout
,
[=]()
{
timer
.stop();
SendData();
});
}
Server
::~Server()
{
delete ui
;
}
void Server
::paintEvent(QPaintEvent
*)
{
QPainter p
;
p
.begin(this);
p
.drawPixmap(rect(),QPixmap(":/0121.jpg"));
p
.end();
}
void Server
::on_pushButtonChoose_clicked()
{
QString filePath
=QFileDialog
::getOpenFileName(this,"open","../");
if(filePath
.isEmpty()==false)
{
Filestyle
="FILE";
FileName
.clear();
FileSize
=0;
QFileInfo
info(filePath
);
FileName
=info
.fileName();
FileSize
=info
.size();
file
.setFileName(filePath
);
bool openOk
=file
.open(QIODevice
::ReadOnly
);
if(openOk
==false)
{
QMessageBox
::information(this,"error","以只读方式打开失败");
return;
}
isTXT
=false;
ui
->textEditWrite
->setText(FileName
);
}
else
{
QMessageBox
::information(this,"error","路径无效");
}
}
void Server
::SendData()
{
qint64 len
=0;
do
{
char buf
[4*1024]={0};
len
=0;
len
=file
.read(buf
,sizeof(buf
));
len
=tcpsocket
->write(buf
,len
);
SendSize
+=len
;
}while(len
>0);
if(SendSize
==FileSize
)
{
ui
->textEditRead
->append(FileName
+" 文件发送完毕");
file
.close();
}
}
void Server
::on_pushButtonSend_clicked()
{
if(isTXT
==true)
{
QString str
=ui
->textEditWrite
->toPlainText();
tcpsocket
->write(str
.toUtf8());
ui
->textEditRead
->append("我: "+str
);
}
else
{
QString head
=QString("%0##%1##%2").arg(Filestyle
).arg(FileName
).arg(FileSize
);
qDebug()<<head
;
qint64 len
=tcpsocket
->write(head
.toUtf8());
if(len
>0)
{
timer
.start(20);
}
else
{
qDebug()<<"头部文件发送失败";
file
.close();
}
}
ui
->textEditWrite
->clear();
isTXT
=true;
}
主函数main.h:
#include "server.h"
#include"client.h"
#include <QApplication>
int main(int argc
, char *argv
[])
{
QApplication
a(argc
, argv
);
Server w
;
Client w2
;
w2
.show();
w
.show();
return a
.exec();
}
客户端窗口控件:
服务器窗口控件:
插入图片:
运行结果概况:
转载请注明原文地址:https://ipadbbs.8miu.com/read-18006.html