当前位置: 首页 > 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"

相关文章:

  • Spring Boot启动流程
  • 力扣每日一题:2712——使所有字符相等的最小成本
  • 车载以太网网络测试-26【SOME/IP-通信方式-2】
  • 【力扣hot100题】(026)合并两个有序链表
  • [RoarCTF 2019]Easy Java1
  • 排序算法可视化工具——基于React的交互式应用
  • openEuler 24.03 (LTS) 安装 docker 记录
  • Go语言从零构建SQL数据库引擎(3)
  • rustdesk 客户端使用
  • 算法篇-------------双指针法
  • Matplotlib绘制常用图像
  • 各种网址整理-vue,前端,linux,ai前端开发,各种开发能用到的网址和一些有用的博客
  • javaweb自用笔记:文件上传案例、登录(统一拦截)案例
  • SpringCould微服务架构之Docker(9)
  • 便捷解析下载热门短视频、图片的安卓免费软件
  • 代码随想录C++算法训练,二叉树(day16)
  • vcpkg安装及使用教程,以安装matio库解析mat文件为例
  • 部署Dify接入微信验证反代根目录创建一个文件通过微信小程序验证
  • 机器学习入门指南:从零开始理解AI的核心
  • 高效屏幕录制软件,涵盖多样功能满足多元需求
  • 网站建设系统公司/郑州网站定制
  • 怎么做便民信息网站/离我最近的广告公司
  • 柳州 网站建设/互动营销名词解释
  • 微网站开发框架/廊坊百度快照优化
  • 广东省住房和城乡建设局网站首页/如何让自己的网站快速被百度收录
  • 导航类网站模板/seo学徒