【Qt】Qt中的QTcpSocket&QTcpServer通信(含项目代码)

QT:Socket通讯(TCP) 学习笔记 阅读详情

简介

本次主要总结学习到的TCP相关知识,并在Qt完成一个本地的TCP通讯的小项目

概念

TCP/IP协议中的传输层协议包括TCP和UDP

1、TCP是一种面向连接的可靠的传输层通讯协议,面向连接即 客户端---服务器

特点:面向连接,有序号,和有序号和确认序号、排序检错、失败重传、用于大文件传输、不支持广播。

实例:HTTP,FTP

2、UDP是一种面向无连接的传输层通信协议。

特点:面向无连接、没有序号和确认序号、不排序检错、不失败重传、简单应答服务、支持广播、多播。

TCP的架构

qt中Tcp通讯的流程(来自于代码)

服务端

  1. 创建QTcpServer--------------------------m_s = new QTcpServer(this);
  2. 监听状态----------------------------------m_s->listen(QHostAddress::Any,port);
  3. 监测客户端连接----------connect(m_s,&QTcpServer::newConnection,this,[=](){
  4. 获得连接-------------------------m_tcp = m_s->nextPendingConnection();
  5. 连接对端接收信号---------------connect(m_tcp,&QTcpSocket::readyRead,this,[=](){
  6. 读取客户端消息---------------QByteArray data = m_tcp->readAll();
  7. 发送数据-------------------------------------------m_tcp->write(msg.toUtf8());
  8. 关闭连接----------------------------------------m_tcp->close();

客户端

  1.  实例化QTcpSocket对象
  2. 连接服务器--connectToHost
  3. 连接对端接收信号--readyRead
  4. 发送数据--write()
  5. 关闭连接--disconnectFromHost()

API QTcpSokect&QTcpServer

1.qt工程的.pro中加入network

QT       += core gui network

2.头文件

#include <QTcpServer>
#include <QTcpSocket>

3.API

singnals:
    readyRead()//对端发送消息
    newConnection()//TcpServer创建新连接
    disconnected()//断开连接

QTcpSocket *nextPendingConnection();//挂起请求产生一个QTcpSocket指针

//监听端口和地址
bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);

//连接到指定的端口和地址
virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);

Qt实现本地TCP通讯项目

项目学习来源:B站 “爱编程的大丙” 老师 老师讲的很好,有时间可以去好好看一下

08-客户端的通信流程处理_哔哩哔哩_bilibili

主打学习分享,如有侵权及时通知删除

效果图:

​

代码实现:

TcpServer

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpServer>
#include <QTcpSocket>
#include <QLabel>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_StartServer_clicked();

    void on_sendMsgButton_clicked();

private:
    Ui::MainWindow *ui;
    QTcpServer *m_s;
    QTcpSocket *m_tcp;
    QLabel *m_status;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->port->setText("8899");
    setWindowTitle("服务端");
    m_s = new QTcpServer(this);

    connect(m_s,&QTcpServer::newConnection,this,[=](){
        m_tcp = m_s->nextPendingConnection();
        m_status->setPixmap(QPixmap(":/res/right.jpeg").scaled(20,20));

        connect(m_tcp,&QTcpSocket::readyRead,this,[=](){
            QByteArray data = m_tcp->readAll();
            ui->record->append("客户端say:"+data);
        });

        connect(m_tcp,&QTcpSocket::disconnected,this,[=](){
            m_tcp->close();
            m_status->setPixmap(QPixmap(":/res/false.jpg").scaled(20,20));
        });
    });

    m_status = new QLabel;
    m_status->setPixmap(QPixmap(":/res/false.jpg").scaled(20,20));
    ui->statusbar->addWidget(new QLabel("连接状态"));
    ui->statusbar->addWidget(m_status);
}

MainWindow::~MainWindow()
{
    delete ui;
    if(m_tcp){
        m_tcp->close();
        m_tcp->deleteLater();
    }
}

void MainWindow::on_StartServer_clicked()
{
    unsigned short port = ui->port->text().toUShort();
    m_s->listen(QHostAddress::Any,port);
    ui->StartServer->setDisabled(true);
}


void MainWindow::on_sendMsgButton_clicked()
{
    QString msg = ui->sendMsg->toPlainText();
    m_tcp->write(msg.toUtf8());
    ui->record->append("服务端say:"+ msg);
}

TcpClient

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTcpSocket>
#include <QLabel>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_sendMsgButton_clicked();

    void on_connect_clicked();

    void on_disconnect_clicked();

private:
    Ui::MainWindow *ui;
    QTcpSocket *m_tcp;
    QLabel *m_status;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QHostAddress>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    ui->port->setText("8899");
    ui->ip->setText("127.0.0.1");
    setWindowTitle("客户端");
    ui->disconnect->setDisabled(true);
    m_tcp = new QTcpSocket(this);

    connect(m_tcp,&QTcpSocket::readyRead,this,[=](){
        QByteArray data = m_tcp->readAll();
        ui->record->append("服务端say:"+data);
    });

    connect(m_tcp,&QTcpSocket::disconnected,this,[=](){
        m_tcp->close();
        m_status->setPixmap(QPixmap(":/res/false.jpg").scaled(20,20));
        ui->record->append("已经断开连接");
        ui->connect->setDisabled(false);
        ui->disconnect->setEnabled(false);
    });

    connect(m_tcp,&QTcpSocket::connected,this,[=](){
        m_status->setPixmap(QPixmap(":/res/right.jpeg").scaled(20,20));
        ui->record->append("已经成功连接到服务器");
        ui->connect->setDisabled(true);
        ui->disconnect->setEnabled(true);
    });

    m_status = new QLabel;
    m_status->setPixmap(QPixmap(":/res/false.jpg").scaled(20,20));
    ui->statusbar->addWidget(new QLabel("连接状态"));
    ui->statusbar->addWidget(m_status);
}

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

void MainWindow::on_sendMsgButton_clicked()
{
    QString msg = ui->sendMsg->toPlainText();
    m_tcp->write(msg.toUtf8());
    ui->record->append("客户端say:"+ msg);
}


void MainWindow::on_connect_clicked()
{
    QString ip = ui->ip->text();
    unsigned short port = ui->port->text().toUShort();
    m_tcp->connectToHost(QHostAddress(ip),port);
}


void MainWindow::on_disconnect_clicked()
{
    m_tcp->close();
    ui->connect->setDisabled(false);
    ui->disconnect->setEnabled(false);
}

【QT】TCP通信(QTcpServer 和 QTcpSocket) TCP是一种被大多数Internet网络协议(如HTTP)用于数据传输的低级网络协议,它是可靠的、面向流、面向连接的传输协议,特别适合于连续数据传输。TCP通信必须先建立TCP连接,分为服务器端和客户端。Qt提供QTcpServer类和QTcpSocket类用于建立TCP通信。服务器端必须使用QTcpServer用于端口监听,建立服务器;QTcpSocket用于建立连接后使用套接字进行通信。 阅读详情

相关推荐

【QT开发】TCP服务器QTcpServer类详解及实战应用

QTcpServer 是 Qt 提供的一个功能强大且灵活的 TCP 服务器类,通过本篇文章的学习,你应该对 QTcpServer 有了全面的理解,能够在自己的项目中正确使用它。QTcpServer 在用户界面中帮助你更好地管理和处理客户端连接,实现高效的 TCP 通信服务,有助于创建用户友好和高效的网络应用场景。

科技改变人类,技术成就未来 3171

QT实现TCP通信(服务器与客户端搭建)

【代码】QT实现TCP通信(服务器与客户端搭建)

小钱努力学C的博客 1万+

QT的TcpServer

newConnection_Slot: 当有客户端的socket建立连接时,tcpserver会发送newConnection()信号,触发连接槽函数,用于创建一个新的socket与客户端对接。

zxz_Fine的博客 2067

qt中Qtcpserver服务端_qt websocket

qt中Qtcpserver服务端_qt websocket

m0_60259116的博客 5043

【科研学习】Demo3D2015安装包以及图文安装步骤

安装包 点击下图的.exe文件,安装 不需要解压,打开注册机 如下图: 点击上图的.exe文件,出现下图 先点击 patch 打开安装目录下的Demo3D.licensing.dll文件,然后点击Generate,生成dvt-license文件,保存即可 打开安装完成的Demo3D 2015(64-bit),一般破解没完成的,会出现一个request a license 的问题,点击find license 的那一行 点击后找到自己Generate,生成dvt

KaelCui的博客 1万+

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7101

基于QT的TCP通信实现(TCPServer和TCPClient)

基于QT实现TCP通信之TCPServer和TCPClient。 近期因为测试需要用到TCPServer(TCP服务端)和TCPClient(TCP客户端)来进行通信和数据的发送以及接受,所以用QT分别写了TCP服务端和TCP客户端,欢迎仪器讨论学习,文中包含源码,文末包含工程文件连接。

weixin_43672168的博客 7279

关于Arduino中的常用函数

一、I/O函数 二、时间函数 三、数学函数 abs 返回其参数的无符号值 【abs(12)返回12,abs(-12)也返回12】 constrain 限制一个数字以阻止它超出范围。第一个参数是被限制的数字,第二个参数是范围区间的开始,第三个参数是允许的数字范围区间的结尾。 【constrain(8,1,10)返回8,constrain(11,1,10)返回10,constrain(0,1,10)返回1】 map 将一个范围内的数字映射到另一个范围。第一个参数是要映射到数字,第二个和第三个参数是from范围(

TREE的博客 7315

Qt的TCP通信—服务端的实现

QTcpServer是从QObject继承的类,他主要用于服务器简历网络监听,创建网络Socket连接。其主要接口函数如图所示。QTcpSocket是从QIODevice间接继承的类,具有流读写的功能,他除了构造函数和析构函数,其他函数都是从QAbstractSocket继承或重定义的。其主要函数接口如下图所示。

weixin_56169816的博客 3719

ANSYS 2026 R1 Windows系统安装避坑指南:环境配置、模块部署与许可证实战

ANSYS作为主流CAE仿真平台,其安装部署已远超传统软件范畴,演变为涉及操作系统底层、GPU驱动兼容性、许可证微服务架构和统一缓存机制的系统工程。理解ANSYS安装原理,需从Windows 11 UEFI安全启动要求、DirectX 12 Ultimate图形栈依赖、gRPC架构的License Manager端口动态分配等核心机制切入;技术价值在于保障HFSS GPU加速、Fluent MPI并行稳定性及Workbench多模块协同可靠性;典型应用场景涵盖高校仿真实验室升级、工业设计院所平台重建及高性能

weixin_29251337的博客 1338

【实战指南】基于YOLOv11的肺结节检测系统开发与优化(LUNA2016数据集)

本文提供了基于YOLOv11模型和LUNA2016数据集开发肺结节检测系统的完整实战指南。详细介绍了从环境搭建、数据预处理、模型训练与优化,到构建Web应用系统的全流程,旨在帮助开发者快速掌握医疗影像AI项目的核心开发技能。

weixin_29031057的博客 136

Qt开发:QTcpServer的详解

QTcpServer 是 Qt 网络模块中的一个核心类,用于实现 基于 TCP 协议的服务端(Server),它负责监听端口、接收客户端连接请求,并通过 QTcpSocket 与客户端通信。

TechNomad的博客 1928

实战指南 | 快速修复Adobe Acrobat 2020安装过程中的常见注册表错误

本文提供了Adobe Acrobat 2020安装过程中遇到“无法打开键”注册表错误的详细修复指南。通过安全编辑注册表,精准定位并删除残留键值,可快速解决此常见安装报错,确保软件顺利安装。同时,文章也介绍了其他安装问题的应对策略与预防措施。

weixin_29200485的博客 554

QT学习笔记之TCP通信1(TCP服务器)

注释:在QWidget派生类的Widget类中的私有槽函数中定义新的槽函数,用于处理新的连接,当tcpServer接受到新的客户端连接时,这个槽函数会被触发。注释:在QWidget派生类的Widget类中的私有槽函数中定义新的槽函数,用于读取从客户端接收的数据,当tcpSocket有数据可读时,这个槽函数会被调用。

Yz12333的博客 3796

PostgreSQL+PostGIS空间数据入库实战:从矢量栅格到GeoServer发布全流程

本文详细介绍了将矢量与栅格空间数据导入PostgreSQL并利用PostGIS扩展进行管理的完整流程。内容涵盖环境搭建、使用shp2pgsql和raster2pgsql工具进行数据入库、基础空间查询验证,以及最终通过GeoServer发布为地图服务的实战步骤,为构建空间数据平台提供清晰指引。

weixin_29268267的博客 288

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TCP通信之QTcpServer和QTcpSocket,服务器和客户端通讯

TCP传输控制协议 是一个可靠的(相对于UDP),面向流,面向连接的运输协议。 Socket 俗称“套接字”。就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。 套接字Socket=(IP地址:端口号) QTcpSocket传输的过程是连续的(对于网络的要求是比较高的,稳定)。TCP编程一

houxian1103的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

QT tcpserver

【代码】QT tcpserver。

CodeHouse的博客 1304

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Qt框架之QTcpServer类

QTcpServer`是Qt框架的一个类,用于创建和管理TCP服务器。它提供了一种简单的方式来监听和受传入的连接请求,并与客户端进行通信。

CSUC的博客 1220

详解 QTcpServer

QTcpServer是一个功能强大的类,能够轻松地管理和处理 TCP 连接。通过信号与槽机制,QTcpServer可以有效地响应新的客户端连接、接收数据并处理断开连接的情况。这使得构建基于 TCP 的网络应用程序变得直观和高效。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 1428

QT 中基于 TCP 的网络通信

基于 TCP 的套接字通信需要用到两个类: 1)QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。 2)QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。

日常解决问题的记录。 2587

Qt实现TCP网络通信

用Qt实现TCP服务器与客户端的信息收发

laoKdx的博客 1837

Roson的Qt之旅 #116 QTcpServer详细介绍

QTcpServer详细介绍;Qt TCP编程;Qt TCP通讯

Allen Roson 2288

Qt中使用TCP服务端及客户端

在Qt中使用TCP服务端及客户端是一种可靠、高效的方法来进行网络通信。QTcpServer和QTcpSocket类提供了一个面向对象的解决方案,使得您能够轻松地开发出各种类型的网络应用程序。然而,请注意因多种原因(例如网络中断、远程主机关闭连接等)导致的时延和异常情况,并确保在代码中处理这些情况以确保应用程序的稳定性。

qq_25549309的博客 3507

从源码角度透视QTcpServer:解构QTcpServer的底层原理与技术细节

TCP(Transmission Control Protocol,传输控制协议)是因特网协议套件中的一部分,它位于传输层,提供可靠的、面向连接的数据传输服务。TCP协议的特点:面向连接:在进行数据传输之前,TCP在通信双方之间建立连接,之后才会开始数据的传输。连接建立包括三步握手,以确保通信的正常进行。可靠性:TCP协议通过序号、确认和重传等机制来确保数据的可靠传输。如果一个数据包未能正确传输,TCP会进行重传以保证数据的完整性。

Lion_Long的博客 3068

Qt网络编程——QTcpServer和QTcpSocket

QTcpServer和QTcpSocket核心API、tcp回显服务器和客户端

Dirty_artist的博客 2868
上一篇: c/c++报错收集(不定时更新)
下一篇: 【Qt】Qt5中函数信号重载&函数重载问题
Gold_boy
博客等级 码龄7年 21粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值