QT开发中文网

qt tcp 使用QDataStream传输文件示例

以下是一个使用Qt和TCP传输文件的示例,使用QDataStream进行数据序列化和反序列化:

// 服务器端代码
QTcpServer server;
QTcpSocket* clientSocket;

void Server::startServer()
{
    server.listen(QHostAddress::Any, 1234);
    connect(&server, SIGNAL(newConnection()), this, SLOT(newConnection()));
}

void Server::newConnection()
{
    clientSocket = server.nextPendingConnection();
    connect(clientSocket, SIGNAL(readyRead()), this, SLOT(readData()));
}

void Server::readData()
{
    QDataStream in(clientSocket);
    in.setVersion(QDataStream::Qt_5_15);

    // 接收文件名
    QString fileName;
    in >> fileName;

    // 创建本地文件用于保存接收的数据
    QFile file(fileName);
    if (!file.open(QIODevice::WriteOnly)) {
        qDebug() << "Failed to open file for writing.";
        return;
    }

    // 逐块接收并写入文件直到结束
    QByteArray block;
    qint64 totalReceived = 0;
    
     while (clientSocket->bytesAvailable() > 0) {
        block = clientSocket->readAll();
        file.write(block);
        totalReceived += block.size();
     }

     file.close();

     qDebug() << "Received file: " << fileName << ", size: " << totalReceived << " bytes";
}
// 客户端代码
QString filePath = "/path/to/file.ext"; // 要发送的文件路径

QTcpSocket socket;

void Client::sendFile()
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly)) {
        qDebug() << "Failed to open file for reading.";
        return;
   }
   
   // 获取文件名
   QString fileName = QFileInfo(file.fileName()).fileName();

   // 连接服务器
   socket.connectToHost(QHostAddress("127.0.0.1"), 1234);
   if (!socket.waitForConnected()) {
        qDebug() << "Failed to connect to server.";
        return;
   }

   // 发送文件名
    QDataStream out(&socket);
    out.setVersion(QDataStream::Qt_5_15);
    out << fileName;

    // 逐块读取并发送文件直到结束
    qint64 totalSent = 0;
    
     while (!file.atEnd()) {
        QByteArray block = file.read(8192);
        socket.write(block);
        totalSent += block.size();
     }

     file.close();
     socket.disconnectFromHost();

     qDebug() << "File sent: " << fileName << ", size: " << totalSent << " bytes";
}

这是一个基本的示例,用于在客户端和服务器之间通过TCP传输文件。你可以根据自己的需求进行更多的优化和处理。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?