TCP传文件

    技术2022-07-11  86

    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 keyPressEvent(QKeyEvent *event); 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: //bool eventFilter(QObject *target, QEvent *event); }; #endif // CLIENT_H

    服务器端头文件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 // SERVER_H

    客户端源代码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); //键盘输入无用 /*ui->textEditWrite->setFocusPolicy(Qt::StrongFocus); ui->textEditWrite->setFocus(); ui->textEditWrite->installEventFilter(this); this->grabKeyboard();*/ 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,"成功","文件接收成功"); //tcpsocket->close(); //tcpsocket->disconnectFromHost(); } } }); connect(&timer,&QTimer::timeout, [=]() { timer.stop(); SendData(); }); /*connect( ui->textEditWrite,SIGNAL(returnPressed()), ui->pushButtonSEND,SIGNAL(clicked()), Qt::UniqueConnection );*/ //ui->pushButtonSEND->setShortcut(Qt::Key_Return); } 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)); //tcpsocket->close(); } 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(); //tcpsocket->disconnectFromHost(); //tcpsocket->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","路径无效"); } } /*bool Client::eventFilter(QObject *target, QEvent *event) { if(target==ui->textEditWrite) { if(event->type()==QEvent::KeyPress) { QKeyEvent *k=static_cast<QKeyEvent*>(event); if(k->key()==Qt::Key_Return) { on_pushButtonSEND_clicked(); return true; } } } return QWidget::eventFilter(target,event); } void Client::keyPressEvent(QKeyEvent *event) { if(event->key()==Qt::Key_Return) { on_pushButtonSEND_clicked(); } }*/

    服务器端源代码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,"成功","文件接收成功"); //tcpsocket->close(); //tcpsocket->disconnectFromHost(); } } }); }); 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(); //tcpsocket->disconnectFromHost(); //tcpsocket->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(); }

    客户端窗口控件:

    服务器窗口控件:

    插入图片:

    运行结果概况:

    Processed: 0.015, SQL: 9