QTcpServer使用多线程处理连接进来的QTcpSocket
来源:互联网 发布:开淘宝店对产品的要求 编辑:程序博客网 时间:2024/06/07 21:18
// qtcpserver使用多线程处理连进来的qtcpsocket端//头文件 #pragma once#include <qtcpserver.h>#include <qtcpsocket.h>#include <qmap.h>// tcpsocket从qtcpsocket继承下来,需要将tcpsocket移到线程里使用,故tcpsocket需处理的都放进槽里,使用信号发射后,槽函数就在线程里运行// tcpserver从QTcpServer继承下来,重载incomingConnection函数class TcpSocket : public QTcpSocket{Q_OBJECTpublic:TcpSocket(int socketdesc,QTcpSocket *parent = NULL);~TcpSocket();private slots:void ReadAndParseData();void SocketErr(QAbstractSocket::SocketError socketError);private:QString m_recvDataStr;};class TcpServer : public QTcpServer{Q_OBJECTpublic:TcpServer(const std::string &ip, int port, QTcpServer *parent = NULL);~TcpServer();protected:void incomingConnection(qintptr socketDescriptor);private slots:void SocketDisconn();private:QList<TcpSocket*> m_socketList;};//cpp文件#include <qthread.h>#include <qlist.h>#include "TcpServer.h"#include "log.h"TcpSocket::TcpSocket(int sock, QTcpSocket *parent) : QTcpSocket(parent){this->setSocketDescriptor(sock);connect(this, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(SocketErr(QAbstractSocket::SocketError)));}TcpSocket::~TcpSocket(){}// 将会移进线程里面运行void TcpSocket::ReadAndParseData(){TcpSocket *socket = (TcpSocket*)sender();QString recvStr = socket->readAll();m_recvDataStr += recvStr;// 对数据的处理}void TcpSocket::SocketErr(QAbstractSocket::SocketError socketError){TcpSocket *socket = (TcpSocket*)sender();WLog(LOG_ERR, "socket[%d] ip[%s] port[%d] err[%s]", socket->socketDescriptor(),socket->peerAddress().toString().toLocal8Bit().data(),socket->peerPort(),socket->errorString().toLocal8Bit().data());}TcpServer::TcpServer(const std::string &ip, int port, QTcpServer *parent) : QTcpServer(parent){bool bsucc;if (ip.empty()){bsucc = this->listen(QHostAddress::AnyIPv4, port);}else{bsucc = this->listen(QHostAddress(ip.c_str()), port);}WLog(LOG_INFO,"listen bsucc[%d],ip[%s] port[%d] errstr[%s]", bsucc,ip.c_str(),port,this->errorString().toLocal8Bit().data());}TcpServer::~TcpServer(){this->close();QList<TcpSocket*>::iterator it = m_socketList.begin();for (; it != m_socketList.end(); ){TcpSocket* sock = *it;m_socketList.erase(it++);delete sock;sock = NULL;}m_socketList.clear();}/*Note: If you want to handle an incoming connection as a new QTcpSocket object in another thread you have to pass the socketDescriptor to the other thread and create the QTcpSocket object there and use its setSocketDescriptor() method.*/void TcpServer::incomingConnection(qintptr socketDescriptor){TcpSocket *socket = new TcpSocket(socketDescriptor);connect(socket, SIGNAL(readyRead()), socket, SLOT(ReadAndParseData())); // 会移进线程里connect(socket, SIGNAL(disconnected()), this, SLOT(SocketDisconn()));QThread *thread = new QThread(socket); // 以socket为父类,当socket释放删除后也会删除线程,或者将线程的quit信号关联槽deleteLater()也可以达到效果connect(socket, SIGNAL(disconnected()), thread, SLOT(quit()));socket->moveToThread(thread);thread->start();emit newConnection(); //文档要求继承本函数需要发射此信号,此处没有与此信号连接的槽}void TcpServer::SocketDisconn(){TcpSocket* socket = (TcpSocket*)sender();QList<TcpSocket*>::iterator it = find(m_socketList.begin(), m_socketList.end(), socket);if (it != m_socketList.end()){m_socketList.erase(it);delete socket;socket = NULL;}}
在外部使用TcpServer *server = new TcpServer(ip,port);即可作为服务器监听
阅读全文
0 0
- QTcpServer使用多线程处理连接进来的QTcpSocket
- QTcpServer和QTcpSocket的使用
- QTcpServer+QTcpSocket使用整理
- QTcpServer使用信号槽单线程方式直接处理连进来的客户端(短连接或少数据处理)
- QTcpSocket QTcpServer 类的使用方法
- 使用QTcpSocket和QTcpServer进行TCP编程
- QT使用QTcpSocket和QTcpServer通信是出现乱码的问题
- QTcpServer与QTcpSocket通讯
- QTcpSocket、QTcpServer基本用法
- QTcpServer / QTcpSocket 简单示例
- 多线程的QTcpServer
- QT 使用QTcpServer QTcpSocket 建立TCP服务器端 和 客户端
- Qt网络编程QTcpServer和QTcpSocket的理解
- QTcpServer、QTcpSocket、QUdpSocket在聊天程序上的应用
- Qt网络编程QTcpServer和QTcpSocket的理解
- Qt QTcpServer的使用
- QTcpSocket类和QTcpServer类
- QTcpSocket类和QTcpServer类
- VMware workstation CentOs 7 虚拟机网卡设置为NAT模式并设置固定IP
- jsp中jstl标签的条件判断语法
- 谈谈 Linux 内核驱动的编码风格
- Android DatePicker OnDateChangedListener不回调(onDateChanged不回调)
- 大数据环境配置
- QTcpServer使用多线程处理连接进来的QTcpSocket
- java 进行json字符串拼接及 接收请求的返回的对象
- Error: Host ' is not allowed to connect to this MariaDB server at Error (native
- 2017第九届广州国际园林机械与园艺工具展 2017第九届广州国际园林景观与美好人居博览会 第九届广州国际花卉盆栽及花店花园用品展览会 2017中国花卉展览会 第九届广州国际绿化苗木展会刊(参展商名录
- pyspark-评估指标
- jdk源码解析(八)——Java虚拟机字节码执行引擎
- jmeter常见问题(二)编码格式错误
- web前端开发笔记:CSS伪类总结
- 微信支付---解析微信返回值