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

Qt网络编程-QTcpServer的封装

简单封装Tcp服务器类,将QTcpServer移入线程

头文件:

#ifndef TCPSERVER_H
#define TCPSERVER_H#include <QObject>class QTcpSocket;
class QTcpServer;
class QThread;
class TcpServer : public QObject {Q_OBJECT
public:explicit TcpServer(const QString &ip, quint16 port,QObject *parent = nullptr);~TcpServer();bool startListening();void stopListen();public slots:void write(const QString &ip, quint16 port, const QByteArray &data);private slots:void handleNewConnect();signals:void clientConnection(const QString &ip, quint16 port, bool connectState);void receiceSocketMessage(const QString &ip, quint16 port,const QByteArray &data);private:QString m_Ip;quint16 m_Port;QThread *m_Thread;QTcpServer *m_Server;QList<QTcpSocket *> m_Sockets;
};#endif // TCPSERVER_H

源文件:

#include "tcpserver.h"
#include <QTcpServer>
#include <QTcpSocket>
#include <QThread>TcpServer::TcpServer(const QString &ip, quint16 port, QObject *parent): QObject(parent), m_Ip(ip), m_Port(port) {m_Server = new QTcpServer;m_Thread = new QThread;connect(m_Server, &QTcpServer::newConnection, this,&TcpServer::handleNewConnect);moveToThread(m_Thread);m_Thread->start();
}TcpServer::~TcpServer() {if (nullptr != m_Server) {if (m_Server->isListening()) stopListen();m_Server->deleteLater();m_Server = nullptr;}if (nullptr != m_Thread) {if (m_Thread->isRunning()) {m_Thread->quit();m_Thread->wait();}m_Thread->deleteLater();m_Server = nullptr;}
}bool TcpServer::startListening() {if (m_Server->isListening()) return true;return m_Server->listen(QHostAddress(m_Ip), m_Port);
}void TcpServer::stopListen() {m_Server->close();
}void TcpServer::write(const QString &ip, quint16 port, const QByteArray &data) {for (QTcpSocket *p : m_Sockets) {if (ip == p->peerAddress().toString() && port == p->peerPort()) {p->write(data);break;}}
}void TcpServer::handleNewConnect() {QTcpSocket *socket = m_Server->nextPendingConnection();QString ip = socket->peerAddress().toString();quint16 port = socket->peerPort();bool contains = false;for (QTcpSocket *p : m_Sockets) {if (ip == p->peerAddress().toString() && port == p->peerPort()) {contains = true;break;}}if (!contains) m_Sockets.append(socket);emit clientConnection(ip, port, true);connect(socket, &QTcpSocket::disconnected, [=]() {emit clientConnection(ip, port, false);for (QTcpSocket *p : m_Sockets) {if (ip == p->peerAddress().toString() && port == p->peerPort()) {m_Sockets.removeOne(p);p->deleteLater();p = nullptr;break;}}});connect(socket, &QTcpSocket::readyRead, [=]() {QByteArray data = socket->readAll();emit receiceSocketMessage(ip, port, data);});
}

调用示例:

   TcpServer *server = new TcpServer("192.168.1.3", 12345);connect(server, &TcpServer::clientConnection,[=](const QString &ip, quint16 port, bool connectState) {//TODO 处理客户端连接});connect(server, &TcpServer::receiceSocketMessage,[=](const QString &ip, quint16 port, const QByteArray &data) {处理收到客户端消息});m_Server->startListening();QByteArray data;//TODO 处理发送数据m_Server->write("192.168.1.4", 12344, data);//指定对应客户端发送数据

http://www.lryc.cn/news/296703.html

相关文章:

  • 【MySQL】_JDBC编程
  • 微信小程序编译出现 project.config.json 文件内容错误
  • 一周学会Django5 Python Web开发-Django5创建项目(用命令方式)
  • DockerUI如何部署结合内网穿透实现公网环境管理本地docker容器
  • UML之在Markdown中使用Mermaid绘制类图
  • Spring Boot + 七牛OSS: 简化云存储集成
  • C++:二叉搜索树模拟实现(KV模型)
  • npm淘宝镜像源换新地址
  • 十大排序算法之线性时间非比较类排序
  • 容器基础:Docker 镜像如何保证部署的一致性?
  • 爪哇部落算法组2024新生赛热身赛题解
  • 1123. 铲雪车(欧拉回路)
  • 网络协议与攻击模拟_15FTP协议
  • 「效果图渲染」效果图与3D影视动画渲染平台
  • Blender_查看版本
  • node.js 读目录.txt文件,用 xml2js 转换为json数据,生成jstree所需的文件
  • 【Docker】02 镜像管理
  • 了解海外云手机的多种功能
  • 白酒:自动化生产线的优势与实践
  • 用HTML5实现灯笼效果
  • Postgresql源码(120)事务XID分配与主备XID同步
  • B2077 角谷猜想(洛谷)
  • 排序算法---归并排序
  • [WUSTCTF2020]朴实无华(特详解)
  • 下载已编译的 OpenCV 包在 Visual Studio 下实现快速配置
  • 【Linux系统学习】3.Linux用户和权限
  • 视频美颜SDK开发指南:从入门到精通的技术实践
  • Electron基本介绍
  • 使用网关过滤器,根据业务规则实现微服务动态路由
  • PKI - 03 密钥管理(如何进行安全的公钥交换)