#pragma once
#include <QtWidgets/QWidget>
#include "ui_QtServer.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QFile>
#include <QTimer>
class QtServer : public QWidget
{
Q_OBJECT
public:
QtServer(QWidget *parent = Q_NULLPTR);
void sendData();
private slots:
void slotFile();
void slotSend();
private:
Ui::QtServerClass ui;
QTcpServer *ptcpServer;
QTcpSocket *ptcpSocket;
QFile file;
QString fileName;
qint64 fileSize;
qint64 sendSize;
QTimer timer;
};
#include "QtServer.h"
#include <QFileDialog>
#include <QFileInfo>
QtServer::QtServer(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
ptcpServer = new QTcpServer(this);
ptcpServer->listen(QHostAddress::Any, 8888);
setWindowTitle(QString::fromLocal8Bit("服务器端口:8888"));
ui.button_File->setEnabled(false);
ui.button_Send->setEnabled(false);
connect(ptcpServer, &QTcpServer::newConnection, [=]() {
ptcpSocket = ptcpServer->nextPendingConnection();
QString IP = ptcpSocket->peerAddress().toString();
quint16 port = ptcpSocket->peerPort();
QString str = QString::fromLocal8Bit("[%1:%2]成功连接").arg(IP).arg(port);
ui.textEdit->setText(str);
ui.button_File->setEnabled(true);
});
connect(ui.button_File, &QPushButton::clicked, this, &QtServer::slotFile);
connect(ui.button_Send, &QPushButton::clicked, this, &QtServer::slotSend);
connect(&timer, &QTimer::timeout, [=]() {
timer.stop();
sendData();
});
}
void QtServer::slotFile()
{
QString filePath = QFileDialog::getOpenFileName(this,QString::fromLocal8Bit("选择文件"),"../");
if (!filePath.isEmpty())
{
fileName.clear();
fileSize = 0;
QFileInfo fileInfo(filePath);
fileName = fileInfo.fileName();
fileSize = fileInfo.size();
sendSize = 0;
file.setFileName(filePath);
bool isOk = file.open(QIODevice::ReadOnly);
if (isOk)
{
ui.textEdit->append(filePath);
ui.button_File->setEnabled(false);
ui.button_Send->setEnabled(true);
}
}
}
void QtServer::slotSend()
{
QString head = QString::fromLocal8Bit("%1##%2").arg(fileName).arg(fileSize);
qint64 len = ptcpSocket->write(head.toUtf8());
if (len > 0)
{
timer.start(20);
}
}
void QtServer::sendData()
{
qint64 len = 0;
do {
char buf[1024] = { 0 };
len = 0;
len = file.read(buf, sizeof(buf));
len = ptcpSocket->write(buf,len);
sendSize += len;
} while (len >0);
if (sendSize == fileSize)
{
ui.textEdit->append(QString::fromLocal8Bit("文件发送完毕"));
file.close();
ptcpSocket->disconnectFromHost();
ptcpSocket->close();
}
}