天天看点

QTcpSocket客户端和服务端发送图片(或大文件)小Demo

先看一下效果:

QTcpSocket客户端和服务端发送图片(或大文件)小Demo

思路:

发图片、大文件与发短字符不大一样。

1、文件和图片通过TCP可能一次发不过去,可能要发很多次。所以我们在发送文件、数据、以及文字最好带上文件的大小。

2、图片转换成文件流的形式,这个Demo是转成base64加密流

核心代码:

1、tcp客户端与服务端的代码这里就不贴了,以前贴过,可以看我以前的帖子。这里贴一下思路代码:

发送图片端:

QByteArray byte = "P" + QByteArray::number(m_base64.length()) + "P";
        m_tcpClient->sendMessageB(byte);
        qDebug() << "len" << byte;
        m_tcpClient->sendMessageB(m_base64);      

这里的“P”只是一个分隔符,可以自定义。m_base64是图片转换成的QByteArray。

看一下接收图片端:

QByteArray tmp = m_socket->readAll();
    if(m_dataLength != 0) {
        m_byte.append(tmp);
        m_dataLength = m_dataLength - tmp.length();
        qDebug() << "m_dataLength " << m_dataLength;
        if(m_dataLength == 0) {
            emit alreadyRead();
        }
    } else {
        int len;
        if(tmp.contains("P")) {
            m_type = "P";
            len = tmp.split('P').at(1).toInt();
        } else if(tmp.contains("T")){
            m_type = "T";
            len = tmp.split('T').at(1).toInt();
        }
        int preNum = 2 + QString::number(len).count();
        m_dataLength = len + preNum - tmp.length();
        m_byte.clear();
        m_byte = tmp.mid(preNum, tmp.count() - preNum);
    }      
#ifndef SBASE64TOIMAGE_H
#define SBASE64TOIMAGE_H

#include <QByteArray>
#include <QBuffer>
#include <QImage>
#include <QPixmap>

class SBase64ToImage : public QObject
{
    Q_OBJECT
public:
    static QByteArray Image_To_Base64(QString ImgPath) {
        QImage image(ImgPath);
        QByteArray ba;
        QBuffer buf(&ba);
        image.save(&buf,"PNG",20);
        QByteArray hexed = ba.toBase64();
        buf.close();
        return hexed;
    }
    static QPixmap Base64_To_Image(QByteArray bytearray) {
        QByteArray Ret_bytearray = QByteArray::fromBase64(bytearray);
        QBuffer buffer(&Ret_bytearray);
        buffer.open(QIODevice::WriteOnly);
        QPixmap imageresult;
        imageresult.loadFromData(Ret_bytearray);
        return imageresult;
    }
};
#endif // SBASE64TOIMAGE_H