【Qt】Qt实践记录2——TCP通信服务器和客户端demo

收获总结:
  • 通过这个项目,我掌握了Qt的Tcp服务器类QTcpServer和Tcp套接字类QTcpSocket的使用。

  • 从读取数据的槽函数调用read() 或 readAll() 读取数据,以及发送按钮的函数调用tcpSocket->write()中,我进一步理解了套接字这个概念。

  • 还练习了Qt ui布局。

  • 还进一步掌握了做gif图演示效果。


项目目标:

熟悉QT网络编程中TCP编程

技术栈与环境:

开发语言: C++ GUI框架: Qt 6.9.0 开发环境: Qt Creator 16.0.1

编译器: MinGW 64-bit 系统平台:Windows 11

最终效果展示:

功能描述:

一个服务器窗口,一个客户端窗口,互相发送消息。^_^

UI布局:

实现:

需要使用到Qt的网络模块:

需要使用的库:

#include <QTcpServer>

#include <QTcpSocket>

窗体类增加成员:

QTcpServer *tcpServer;

QTcpSocket *tcpSocket;

需要使用的类的方法:

Server:

1、QTcpServer的方法QTcpServer():new一个实例

2、QTcpSocket的方法QTcpSocket():new一个实例

3、newConnection: newConnection()信号是QTcpServer类内置的信号。当服务器监听到新的客户端连接请求时,会自动触发此信号。

4、readyRead: 这是 QTcpSocket 的内置信号,当套接字接收到新的数据时自动触发。

5、listen: Call listen() to have the server listen for incoming connections. The newConnection() signal is then emitted each time a client connects to the server.

bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)

Tells the server to listen for incoming connections on address address and port port. If port is 0, a port is chosen automatically. If address is QHostAddress::Any, the server will listen on all network interfaces.

Returns true on success; otherwise returns false.

6、tcpServer->close():

void QTcpServer::close()

Closes the server. The server will no longer listen for incoming connections.

7、tcpSocket->write():

8、connectToHost:

功能实现方法:

Server端:点击打开按钮,开始监听,使用lisetn从指定端口(输入的)监听任意主机;当服务器监听到新的客户端连接请求时,会自动触发newConnection信号,将tcpServer的此信号和自定义的连接槽函数绑定;在自定义的槽函数将QTcpSocket的readyRead信号和自定义的读取槽函数绑定;在自定义的读取槽函数中读取套接字的数据,显示到ui上;关闭按钮:关服务器;发送按钮:往套接字里写数据。

cpp 复制代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    tcpServer = new QTcpServer(this);
    tcpSocket = new QTcpSocket(this);
    //QTcpSocket 类的实例,表示一个TCP套接字,通常用于客户端或服务器与客户端的通信

    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnection_Slot()));
    //关联tcpServer发出的newConnection()信号和this(此Widget实例)下自定义的newConnection_Slot()槽函数
    //newConnection()信号是QTcpServer类内置的信号。当服务器监听到新的客户端连接请求时,会自动触发此信号。
}

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

void Widget::newConnection_Slot()
{
    tcpSocket = tcpServer->nextPendingConnection();  //获得已经连接的客户端的Socket信息
    connect(tcpSocket, &QTcpSocket::readyRead, this, &Widget::readyRead_Slot);
    //readyRead: 这是 QTcpSocket 的内置信号,当套接字接收到新的数据时自动触发。
    //触发条件:操作系统内核的套接字接收缓冲区中有数据可读(例如对方发送了数据,或网络传输的数据到达本地)。
    //当网络数据到达套接字时,Qt的事件循环会检测到可读事件,并触发 readyRead() 信号。
    //通过信号与槽机制,自动调用 readyRead_Slot() 槽函数,实现异步、非阻塞的数据处理。

}

Client:类似,更简单。因为不用使用QTcpServer类。

可优化点:

搞搞多客户端的。^_^

相关推荐
李某学编程9 小时前
基于ARM的微机原理学习笔记(一)
arm开发·笔记·学习
sbjdhjd10 小时前
AI产业周度动态:从“更强模型”走向“可执行、可治理、可计价”的系统竞争 (2026年10月19日—10月25日)
人工智能·笔记·ai·开源·gemini·信息差·claude code
ss27311 小时前
AI时代首先数据库-PostgreSQL实战笔记 27 PostgreSQL数据写入与读取流程解析
数据库·笔记·postgresql
沫璃染墨12 小时前
《Qt从零入门系列(十五):Qt线程安全与锁机制详解——从QMutex到RAII与读写锁实战》
开发语言·c++·qt·安全·交互·线程·qt6.3
深圳老胡12 小时前
压力检测空吸功能硬件方案全解析:主流压力传感器品牌与实现路径
笔记·单片机·代码规范
程序猿追12 小时前
返回 null 不一定入队成功:鸿蒙 KMP上的并发优先队列观察笔记
笔记·华为·harmonyos·kmp
崔高杰13 小时前
【多论文阅读笔记】下一阶段,Agent记忆关注什么能力?
论文阅读·笔记
ms72wx13 小时前
Docker 命令学习笔记:从入门到进阶的实战指南
笔记·学习·docker
NoteDeep 深度笔记15 小时前
排期看不出冲突?把任务表切成甘特图
笔记·个人开发·甘特图·笔记应用·深度笔记·云笔记
霍霍的袁16 小时前
【C++11】左值右值引用与移动语义详细笔记(左值右值、右值引用、移动构造、移动赋值、引用折叠、万能转发)
c++·笔记·学习·visual studio