QT5.10控制台下利用QTcpSocket类局域网传送图片

本文详细介绍使用Qt的QTcpSocket进行图片传输的过程,包括客户端发送和服务器接收两端的实现细节,展示了如何处理大文件传输时的数据包拆分与拼接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

与简单的传送一个包含字符串和int变量的结构对象不同,图片属于大文件,传送时会自动拆分为多个小包并一一传送,所以接收的时候需要多次接收并拼接。

客户端(发送):


#include <iostream>

#include <QApplication>

#include <QPixmap>/

//QT Socket
#include <QTcpSocket>
#include <QHostAddress>

#include <QBuffer>

using namespace std;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);


    QTcpSocket socket1;

    //开始连接服务端
    socket1.connectToHost(QHostAddress("192.168.100.101"),50002);//设置连接信息,并尝试连接

    qDebug() <<"正在连接服务器,最长5秒...";
    if (socket1.waitForConnected(5000))//连接等待,如果connectToHost连接成功,则立即返回true,否则到达最延迟后返回false
    {
        qDebug() << "已连接!";
    }
    else{
        qDebug() << "连接失败!";
        socket1.close();
        return a.exec();
    }

    QPixmap Pixmap("aaa.bmp");
    QBuffer buffer;
    Pixmap.save(&buffer,"bmp");

    quint32 pix_len = (quint32)buffer.data().size();
    qDebug() << "image size:" << pix_len;

    QByteArray dataArray;
    dataArray.append(buffer.data());

    quint32 write_len = socket1.write(dataArray);
    qDebug() << "write len:" << write_len;

    if(socket1.waitForBytesWritten(10000))
    {
        qDebug() << "data发送成功!";
    }else
    {
        qDebug() << "发送超时!";
    }


    socket1.close();
    return a.exec();
}

服务端(接收):

#include <iostream>

#include <QApplication>

//QT Socket
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostAddress>

#include <QPixmap>
#include <QBuffer>

using namespace std;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);


    QTcpServer server;
    server.listen(QHostAddress::Any,50002);

    QTcpSocket * socket;

    qDebug() << "正在获取连接...最长100秒";
    if(server.waitForNewConnection(100000))
    {
        qDebug() << "连接成功!";
        socket = server.nextPendingConnection();
    }else
    {
        qDebug() << "等待连接超时!";
        server.close();
        return a.exec();
    }

    QByteArray array;
    if(socket->waitForReadyRead(100000))//等待直到有可读内容,最长100秒
    {
        while(socket->waitForReadyRead(100))
        {
            qDebug()<< "bytesAvailable";
            array.append((QByteArray)socket->readAll());//append()会拼接多个小包
        }
    }else
    {
        qDebug() << "读取等待超时!";
        server.close();
        return a.exec();
    }

    QPixmap pixmap;
    pixmap.loadFromData(array);//提取图片

    if(pixmap.save("ddd","bmp"))
        qDebug() << "保存图片成功!";

    cout << "end" << endl;
    server.close();
    return a.exec();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值