Qt实现Socket从文件发送多幅图片(Qt③)

这篇博客记录了使用Qt实现通过Socket从文件发送和接收不同格式图片的过程。介绍了如何选择图片文件、读取文件夹中的所有图片,并在客户端和服务器端进行图片的显示和切换。同时,讨论了发送大量图片时的优化思路,包括多线程处理以避免界面卡顿。
摘要由CSDN通过智能技术生成

初学者记录学习内容,如有错误请各位前辈指点。

这次的项目实现将在上次完成“单幅图片从客户端发送到服务器”的基础上继续添加。
主要添加的功能的是
①客户端和服务器可以选择读取和保存图片的文件,而不是存入到内存中。
②发送接收不同格式的图片。
③服务器读取文件中所有的图片,显示到界面上,并且可以切换图片。
文档目录

服务器Server

服务器端的界面依旧是那样的简洁
server界面
sendButton发送图片,disconnectButton断开连接,picturePathEdit得出读取图片的路径,saveButton选择路径。
直接贴代码:
filepictureserver.h

#ifndef FILEPICTURESERVER_H
#define FILEPICTURESERVER_H

#include <QDialog>
#include <QTcpServer>
#include <QTcpSocket>
#include <QDebug>
#include <QFileDialog>
#include <QMessageBox>
#include <QStringList>
#include <vector>
#include <QByteArray>
#include <QDataStream>
#include <QBuffer>
#include <QString>

using namespace std;//std::vector

namespace Ui {
class filePictureServer;
}

class filePictureServer : public QDialog
{
    Q_OBJECT

public:
    explicit filePictureServer(QWidget *parent = 0);
    ~filePictureServer();

private slots:
    void sendPictures();
    void showDirectory();
    void disconnectSocket();
    void acceptConnection();
    void displayError(QAbstractSocket::SocketError);

private:
    Ui::filePictureServer *ui;
    QTcpServer *tcpServer;
    QTcpSocket *tcpSocket;
    QFileDialog *fileDialog;
    QStringList pictureString_list;
    vector<QPixmap> picturelist;
    int picIndex;

};

#endif // FILEPICTURESERVER_H

filepictureserver.cpp

#include "filepictureserver.h"
#include "ui_filepictureserver.h"
#include <windows.h>
#include "utility.h"

filePictureServer::filePictureServer(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::filePictureServer)
{
    ui->setupUi(this);
    tcpServer = new QTcpServer(this);
    if(!tcpServer->listen(QHostAddress::Any,7777))
    {
        qDebug()<<tcpServer->errorString();
        close();
    }
    tcpSocket = NULL;
    connect(ui->sendButton,SIGNAL(clicked(bool)),this,SLOT(sendPictures()));
    connect(ui->saveButton,SIGNAL(clicked(bool)),this,SLOT(showDirectory()));
    connect(ui->disconnectButton,SIGNAL(clicked(bool)),this,SLOT(disconnectSocket()));
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(acceptConnection()));

    picIndex = 0;

}

filePictureServer::~filePictureServer()
{
    delete ui;
}

void filePictureServer::sendPictures()
{
    if(tcpSocket==NULL)
        return;
    QByteArray block;
    QBuffer buffer;
    QString style;
    QDataStream out(&block,QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_8);
    style = pictureString_list[picIndex].right(3);
    picturelist[picIndex].save(&buffer,style.toStdString().c_str());
    picIndex++;
    out<<(quint32)buffer.data().size();
    out<<style;
    block.append(buffer.data());
    tcpSocket->write(block);
    if(picIndex>=picturelist.size())
        picIndex = 0;
}

void filePictureServer::showDirectory()
{
    fileDialog=ne
  • 10
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt可以通过网络编程实现文件的相互发送。网络编程是一种使用网络协议进行通信的编程方法,可以在网络上实现数据的传输和通信功能。 在Qt中,可以使用QTcpSocketQTcpServer类来实现网络通信。QTcpSocket是用于客户端的套接字类,QTcpServer用于服务端。 首先,需要创建一个服务端程序和一个客户端程序。服务端程序通过QTcpServer监听来自客户端的连接请求,并接受连接。客户端程序通过QTcpSocket连接到服务端程序。 服务端程序需要以下几个步骤来实现文件发送: 1. 创建一个QTcpServer对象,并绑定监听的IP地址和端口号; 2. 调用listen()函数开始监听; 3. 重写QTcpServer的incomingConnection()函数,当有新的连接请求时会触发该函数; 4. 在incomingConnection()函数中,可以调用nextPendingConnection()函数接受客户端的连接,并获取一个QTcpSocket对象; 5. 使用QTcpSocket对象的write()函数向客户端发送文件内容。 客户端程序需要以下几个步骤来实现文件的接收: 1. 创建一个QTcpSocket对象; 2. 调用connectToHost()函数连接到服务端的IP地址和端口号; 3. 在connected()信号触发时,表示连接成功; 4. 在readyRead()信号触发时,表示有数据可读,可以使用readAll()函数读取数据; 5. 将接收到的数据写入到文件中。 通过以上步骤,就可以在Qt实现文件的相互发送。需要注意的是,发送文件时需要分包发送以及文件的分段发送,来保证数据的完整性和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值