与简单的传送一个包含字符串和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();
}