当前位置:首页 C++ > 正文

QT中c++利用TCP协议实现了一个多线程的文件互传系统

作者:野牛程序员:2024-01-22 18:02:08 C++阅读 2602

在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
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击