QT中c++利用TCP协议实现了一个多线程的文件互传系统
作者:野牛程序员:2024-01-22 18:02:08 C++阅读 2881
在QT中,使用C++编写多线程的文件传输系统是一种常见的任务。以下是一个简单的示例,演示了如何使用TCP协议在多线程环境中进行文件传输。请注意,这只是一个基本示例,实际应用中可能需要更多的错误处理和安全性检查。
// main.cpp
#include <QCoreApplication>
#include "server.h"
#include "client.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 在单独的线程中启动服务器
Server serverThread;
serverThread.start();
// 在主线程中启动客户端
Client client;
client.sendFile("path/to/your/file.txt");
return a.exec();
}// server.h
#ifndef SERVER_H
#define SERVER_H
#include <QTcpServer>
#include <QThread>
class Server : public QThread
{
Q_OBJECT
public:
explicit Server(QObject *parent = nullptr);
protected:
void run() override;
private slots:
void newConnection();
private:
QTcpServer *tcpServer;
};
#endif // SERVER_H// server.cpp
#include "server.h"
#include <QTcpSocket>
Server::Server(QObject *parent) : QThread(parent)
{
tcpServer = new QTcpServer(this);
connect(tcpServer, &QTcpServer::newConnection, this, &Server::newConnection);
if (!tcpServer->listen(QHostAddress::Any, 1234)) {
qDebug() << "无法启动服务器:" << tcpServer->errorString();
} else {
qDebug() << "服务器启动在端口 1234";
}
}
void Server::run()
{
exec(); // 启动线程的事件循环
}
void Server::newConnection()
{
while (tcpServer->hasPendingConnections()) {
QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
// 在单独的线程或类中处理客户端套接字
// 为简单起见,仅打印从客户端接收到的数据
connect(clientSocket, &QTcpSocket::readyRead, [=]() {
qDebug() << "从客户端接收到数据:" << clientSocket->readAll();
});
}
}// client.h
#ifndef CLIENT_H
#define CLIENT_H
#include <QTcpSocket>
#include <QThread>
class Client : public QObject
{
Q_OBJECT
public:
explicit Client(QObject *parent = nullptr);
void sendFile(const QString &filePath);
private slots:
void connected();
void bytesWritten(qint64 bytes);
private:
QTcpSocket *tcpSocket;
};
#endif // CLIENT_H// client.cpp
#include "client.h"
#include <QFile>
Client::Client(QObject *parent) : QObject(parent)
{
tcpSocket = new QTcpSocket(this);
connect(tcpSocket, &QTcpSocket::connected, this, &Client::connected);
connect(tcpSocket, &QTcpSocket::bytesWritten, this, &Client::bytesWritten);
tcpSocket->connectToHost("127.0.0.1", 1234); // 连接到服务器
}
void Client::sendFile(const QString &filePath)
{
QFile file(filePath);
if (file.open(QIODevice::ReadOnly)) {
// 读取文件内容
QByteArray fileData = file.readAll();
// 将文件数据发送到服务器
tcpSocket->write(fileData);
file.close();
}
}
void Client::connected()
{
qDebug() << "已连接到服务器";
}
void Client::bytesWritten(qint64 bytes)
{
qDebug() << "已写入字节数:" << bytes;
}这个示例中,Server 类继承自 QThread,用于在一个独立的线程中监听来自客户端的连接。Client 类用于在主线程中连接到服务器并发送文件。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:C++STL库常用库函数总结
- 下一篇:c++泛洪算法
