QT开发中文网

qt客户端给服务端发文件的例子 客户端和服务端的代码都写出来

好的,下面是一个使用Qt实现的客户端和服务端文件传输的示例代码:

客户端代码:

// 客户端
#include <QTcpSocket>
#include <QFile>

void sendFileToServer(const QString& filePath)
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "无法打开文件:" << file.errorString();
        return;
    }

    QTcpSocket socket;
    socket.connectToHost("服务器IP地址", 12345); // 替换为实际的服务器IP地址和端口号

    if (!socket.waitForConnected()) {
        qDebug() << "无法连接到服务器:" << socket.errorString();
        return;
    }

    // 发送文件名和大小给服务器
    QString fileName = QFileInfo(file.fileName()).fileName();
    qint64 fileSize = file.size();
    QByteArray data = QString("%1:%2").arg(fileName).arg(fileSize).toUtf8();
    socket.write(data);

    // 发送文件内容给服务器
    while (!file.atEnd()) {
        QByteArray buffer = file.read(8192); // 每次读取8KB数据
        socket.write(buffer);
        if (!socket.waitForBytesWritten()) {
            qDebug() << "写入套接字错误:" << socket.errorString();
            break;
        }
    }

   // 关闭套接字和文件
   socket.close();
   file.close();
}

服务端代码:

// 服务端
#include <QTcpServer>
#include <QTcpSocket>
#include <QFile>

void receiveFileFromClient()
{
     QTcpServer server;
     if (!server.listen(QHostAddress::Any, 12345)) { // 监听所有IP地址,端口号为12345
         qDebug() << "无法启动服务器:" << server.errorString();
         return;
     }

     while (true) {
         if (!server.waitForNewConnection()) {
             qDebug() << "等待客户端连接超时";
             continue;
         }

         QTcpSocket *clientSocket = server.nextPendingConnection();

         // 读取客户端发送的文件名和大小
         QByteArray data = clientSocket->readAll();
         QString receivedData(data);
         QStringList parts = receivedData.split(':');
         if (parts.size() != 2) {
             qDebug() << "接收到的数据格式不正确";
             clientSocket->close();
             delete clientSocket;
             continue;
         }

        QString fileName = parts.at(0);
        qint64 fileSize = parts.at(1).toLongLong();

        QFile file(fileName);
        if (!file.open(QIODevice::WriteOnly)) {
            qDebug() << "无法打开文件进行写入:" << file.errorString();
            clientSocket->close();
            delete clientSocket;
            continue;
        }

        // 接收文件内容并写入文件
        qint64 bytesReceived = 0;
        while (bytesReceived < fileSize) {
            if (!clientSocket->waitForReadyRead()) {
                qDebug() << "从套接字中读取数据错误:" << clientSocket->errorString();
                break;
            }
            
            QByteArray buffer = clientSocket->readAll();
            file.write(buffer);
            
            bytesReceived += buffer.size();
        }
        
        // 关闭套接字和文件
        clientSocket->close();
        delete clientSocket;
    }
}

以上代码仅提供一个基本示例,实际应用中你可能需要添加更多的错误处理、进度更新和安全性措施。同时,请将代码中的”服务器IP地址”替换为实际使用的值。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=9317

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?