当前位置: 首页 > news >正文

【QT5 网络编程示例】TCP 通信

文章目录

  • TCP 通信

TCP 通信

QT主要通过QTcpSocketQTcpServer两个类实现服务器和客户端的TCP 通信。

QTcpSocket 是 Qt 提供的套接字类,看用于建立、管理和操作 TCP 连接。

常用方法

  • connectToHost(host, port):连接到指定服务器。
  • disconnectFromHost():断开连接。
  • write(QByteArray):发送数据。
  • readAll():读取所有可用数据。
  • waitForConnected(int timeout):等待连接成功。
  • waitForReadyRead(int timeout):等待数据可读。

常用信号

  • connected():连接成功时触发。
  • disconnected():连接断开时触发。
  • readyRead():有新数据可读时触发。
  • errorOccurred(QAbstractSocket::SocketError):发生错误时触发。

QTcpServer 是 Qt 提供的 TCP 服务器类,它主要用于监听和接受客户端连接。

常用方法

  • listen(QHostAddress, quint16 port):监听指定 IP 和端口。
  • close():关闭服务器。
  • hasPendingConnections():是否有新的连接请求。
  • nextPendingConnection():获取新的连接对象。

常用信号

  • newConnection():有新的客户端连接时触发。

注意:要使用这两个类需要在项目文件中添加:

QT += network

下面给出一个简单示例:
https://github.com/BinaryAI-1024/QtStudy/tree/master/network/TCP

服务器监听端口 12345,等待客户端连接。 客户端连接服务器并发送 "Hello from client!\n"。 服务器收到消息后打印,并向客户端发送 "Hello from server!\n"。 客户端收到服务器消息后打印。

服务器代码

// tcpserver.h
#ifndef TCPSERVER_H
#define TCPSERVER_H#include <QTcpServer>
#include <QTcpSocket>
#include <QObject>class TcpServer : public QObject {Q_OBJECT
public:explicit TcpServer(QObject *parent = nullptr); ~TcpServer();void startServer(quint16 port); // 启动服务器并监听指定端口private slots:void onNewConnection(); // 处理新的客户端连接void onReadyRead(); // 处理客户端发送的数据private:QTcpServer *server; // 监听 TCP 连接的服务器对象QTcpSocket *clientSocket; // 当前连接的客户端套接字
};#endif // TCPSERVER_H
// tcpserver.cpp
#include "tcpserver.h"
#include <QDebug>// 构造函数,初始化 QTcpServer 并连接 newConnection 信号
TcpServer::TcpServer(QObject *parent) : QObject(parent), server(new QTcpServer(this)) {//  // 每次有新连接可用时都会发出 newConnection() 信号connect(server, &QTcpServer::newConnection, this, &TcpServer::onNewConnection);
}// 析构函数,关闭服务器
TcpServer::~TcpServer() {server->close();
}// 启动服务器,监听指定端口
void TcpServer::startServer(quint16 port) {if (server->listen(QHostAddress::Any, port)) {qDebug() << "Server started on port" << port;} else {qDebug() << "Server failed to start!";}
}// 处理新客户端连接
void TcpServer::onNewConnection() {clientSocket = server->nextPendingConnection(); // 获取新连接的客户端套接字// 连接客户端的 readyRead 信号(有数据可读时触发)connect(clientSocket, &QTcpSocket::readyRead, this, &TcpServer::onReadyRead);// 连接客户端的 disconnected 信号(客户端断开连接时触发)connect(clientSocket, &QTcpSocket::disconnected, clientSocket, &QTcpSocket::deleteLater);qDebug() << "New client connected!";clientSocket->write("Hello from server!\n"); // 发送欢迎消息给客户端
}// 处理客户端发送的数据
void TcpServer::onReadyRead() {QByteArray data = clientSocket->readAll(); // 读取客户端数据qDebug() << "Received from client:" << data;
}

客户端代码

// tcpclient.h
#ifndef TCPCLIENT_H
#define TCPCLIENT_H#include <QTcpSocket>
#include <QObject>class TcpClient : public QObject {Q_OBJECT
public:explicit TcpClient(QObject *parent = nullptr);~TcpClient();void connectToServer(const QString &host, quint16 port); // 连接到指定服务器private slots:void onConnected(); // 处理成功连接到服务器的事件void onReadyRead(); // 处理从服务器接收的数据private:QTcpSocket *socket; // 客户端 TCP 套接字对象
};#endif // TCPCLIENT_H
// tcpclient.cpp
#include "tcpclient.h"
#include <QDebug>// TcpClient 构造函数,初始化 QTcpSocket 并连接信号槽
TcpClient::TcpClient(QObject *parent) : QObject(parent), socket(new QTcpSocket(this)) {connect(socket, &QTcpSocket::connected, this, &TcpClient::onConnected); // 连接成功信号connect(socket, &QTcpSocket::readyRead, this, &TcpClient::onReadyRead); // 读取数据信号
}// TcpClient 析构函数,关闭套接字
TcpClient::~TcpClient() {socket->close();
}// 连接到服务器的指定主机和端口
void TcpClient::connectToServer(const QString &host, quint16 port) {socket->connectToHost(host, port);
}// 处理成功连接到服务器的事件
void TcpClient::onConnected() {qDebug() << "Connected to server!";socket->write("Hello from client!\n"); // 发送消息给服务器
}// 处理从服务器接收的数据
void TcpClient::onReadyRead() {QByteArray data = socket->readAll();qDebug() << "Received from server:" << data;
}

主函数

// main.cpp
#include <QCoreApplication>
#include "tcpserver.h"
#include "tcpclient.h"int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 启动服务器TcpServer server;server.startServer(12345);// 启动客户端,连接到服务器TcpClient client;client.connectToServer("127.0.0.1", 12345);return a.exec();
}

结果:

Server started on port 12345
New client connected!
Connected to server!
Received from server: "Hello from server!\n"
Received from client: "Hello from client!\n"

http://www.mrgr.cn/news/96630.html

相关文章:

  • Kong网关研究
  • 【Unity】记录TMPro使用过程踩的一些坑
  • Spark,上传文件
  • HTML中数字和字母不换行显示
  • 数据结构和算法(十一)--图
  • 去中心化稳定币机制解析与产品策略建议
  • ros2--xacro
  • Python-八股总结
  • 【群智能算法改进】一种改进的蜣螂优化算法IDBO[3](立方混沌映射Cubic、融合鱼鹰勘探策略、混合高斯柯西变异)【Matlab代码#92】
  • 【MVC简介-产生原因、演变历史、核心思想、组成部分、使用场景】
  • 【Pandas】pandas Series to_markdown
  • 六种光耦综合对比——《器件手册--光耦》
  • 十五届蓝桥杯省赛Java B组(持续更新..)
  • ISIS【路由协议讲解】-通俗易懂!
  • 汇编学习之《数据传输指令》
  • Sentinel[超详细讲解]-1
  • JAVASE(十二)常用类(一)Object类
  • HTML实现图片上添加水印的工具
  • 使用大语言模型进行Python图表可视化
  • 高级java每日一道面试题-2025年3月20日-虚拟化操作系统篇[Docker篇]-如何控制docker容器的启动顺序?