Qt的QTcpServer连接后跨线程接收数据,即跨线程传递使用QTcpSocket连接对象
Qt QTcpServer类一个类(线程)listen监听连接,另一个类(线程)收发数据。
Qt规定,QTcpSocket不能作为参数传递。如果做参数传递,编译时就会报错提示。
用server端获取到连接QTcpSocket对象后如果要另一个线程收发数据。连接线程中新连接信号QTcpServer::newConnection的自定义槽函数中 ,通过QTcpServer::nextPendingConnection()返回获取到QTcpSocket对象,然后通过QTcpSocket::socketDescriptor()获取到socketDescriptor后,发信号传递给另一个线程中建立QTcpSocket对象,再setSocketDescriptor(),就获得了这个QTcpSocket对象。并且可以通过它获取到连接双方ip、port等信息。接收线程槽函数如下:
void CommCtrl::slotSocketConncet(qintptr socketDescriptor)
{QTcpSocket* pTcpSocket = new QTcpSocket(this);m_socketList.append(pTcpSocket);//添加到QTcpSocket*的列表,方便管理pTcpSocket->setSocketDescriptor(socketDescriptor);connect(pTcpSocket, &QTcpSocket::readyRead, this, &CommCtrl::slotNetReadReady); //有可读的信息,触发读槽函数connect(pTcpSocket, &QTcpSocket::disconnected, this, &CommCtrl::slotSocketDisconnect);qDebug() << "connect" << pTcpSocket->peerAddress().toString() << ":" << pTcpSocket->peerPort();
}
但是,这样程序会报警告:
QSocketNotifier: Multiple socket notifiers for same socket 1100 and type Read
查资料了解到,这时需要重写QTcpServer类的虚函数解决这个问题。
protected:
virtual void incomingConnection(qintptr socketDescriptor);
重写QTcpServer类中的虚函数void incomingConnection(qintptr socketDescriptor),就可以获取到socketDescriptor了,而这时QTcpSocket还不会创建,自然不会报QSocketNotifier: Multiple socket notifiers for same socket 1100 and type Read。
重写类头文件:
#ifndef TCPSERVERTHR_H
#define TCPSERVERTHR_H#include <QTcpServer>class TcpServerThr : public QTcpServer
{Q_OBJECT
public:explicit TcpServerThr(QObject *parent = nullptr);private:void incomingConnection(qintptr socketDescriptor);signals:void signalNewConnection(qintptr socketDescriptor);};#endif // TCPSERVERTHR_H
重写类源文件:
#include "tcpserverthr.h"#include <QDebug>TcpServerThr::TcpServerThr(QObject *parent) : QTcpServer(parent)
{}void TcpServerThr::incomingConnection(qintptr socketDescriptor)
{emit signalNewConnection(socketDescriptor);qDebug() << "TcpServerThr::incomingConnection()";
}
Qt的QTcpServer连接后跨线程接收数据,即跨线程传递使用QTcpSocket连接对象相关推荐
- 【TCP协议】主动方关闭连接后不能继续接收数据?
如果你搜过TCP的四次挥手相关信息,你一定会看到类似这样的话:"主动方选择关闭连接后,被动方马上回ACK,此时可以继续传输数据,传完后再发送FIN" (图片来源:CS-Notes/ ...
- 计算机网络没有接收数据,本地连接有发送无接收数据的解决方法
"本地连接"有发送无接收数据的解决方法 发布时间:2013-07-23 23:34:03 作者:佚名 我要评论 在日常的网络维护中,常常出现"本地连接" ...
- 手把手教你Android手机与BLE终端通信--连接,发送和接收数据
假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...
- qt 一个线程接收数据 主线程更新界面 会造成界面退出 怎么解决_打造一个好产品...
编辑导语:一个好的产品,关键在于产品经理和团队:产品经理对于产品如何理解以及产品更新迭代时的需求变化,产品如何实现更好的体验等等:本文作者分享了关于产品经理经常犯的七个问题,我们一起来看一下. 不管怎 ...
- Oracle 跨库查询表数据(不同的数据库间建立连接)
1.情景展示 当需要从A库去访问B库中的数据时,就需要将这两个库连接起来: 两个数据库如何实现互联互通,在oracle中,可以通过建立DBLINK实现. 2.解决方案 2018/12/05 第一步:创 ...
- html页面跨域提交数据,前端跨域的整理
跨域整理 1. 跨域资源共享 CORS 对于web开发来讲,由于浏览器的同源策略,我们需要经常使用一些hack的方法去跨域获取资源,但是hack的方法总归是hack.直到W3C出了一个标准-CORS- ...
- oracle跨库插入数据,Oracle跨数据库查询并插入实现原理及代码
工作中需要从一个数据库中的表GIS_WEICHAI_DATA_1S中的数据导入到另个一数据库的表GIS_WEICHAI_DATA_1S中,数据库服务器都是远程的!我的实现方法是在本地使用PL/SQL操 ...
- 使用c#实现tcp的连接和发送接收数据
最近有个小项目,需要调用装置的录波数据,使用tcp模式,在这里整理了下如何使用c#实现tcp连接并实现发送接收数据,分享出来. 我这里使用的tcpclient ,终端是tcpserver模式. 首先自 ...
- 无线网络连接后总是提示可能需要其他登陆信息
无线网络连接后总是提示可能需要其他登陆信息,但网络已连接可以上网. 运行(开始菜单键+R)输入 regedit 回车打开注册表编辑器. 找到注册表键值HKEY_LOCAL_MACHINE\SYSTEM ...
最新文章
- java不可编辑的文本框_如何使编辑文本不可编辑,但在JAVA中可点击
- 《Windows 系列》- 右击添加管理员权限
- SpringMVC+uploadify文件上传
- C++ 读取结束的判断
- 浙大计算机学院吴飞,浙江大学吴飞教授来我院作人工智能学术报告
- pandas学习笔记三之赋值操作
- box-sizing 的作用
- Unity资源打包之Assetbundle
- 一名清华考研者自诉:福昕PDF阅读器APP让我找回希望
- python爬虫之模拟登陆(CSDN篇)
- 分享一下免费的ppt网站(好看,免费)
- MacBook M1 虚拟机安装Windows7 Xp
- 运维简历怎么写项目描述_简历中的项目描述
- 知识点滴 - 关于苹果认证MFI
- uniapp H5嵌套通讯方案-webviewiframe
- 盘点2021款iPad Pro 5个增强功能,与上一代有什么区别?
- 1000!末尾 有几个0
- 省协湖北中心 计算机科学与技术,国家知识产权局专利局专利审查协作湖北中心...
- App 性能测试分享
- 数字化智能工厂解决方案47页
热门文章
- Linux下快速查看CPU使用情况的相关命令
- Spring 入门教程
- GitHub开源:升讯威微信营销系统(第三方微信平台)完整源代码
- ms10_018漏洞利用实践
- 泛微京桥通集成SAP,让采购流程闭环、业务管理一体化
- 国密算法SM4 的JAVA实现(基于BC实现)
- 零基础如何入门和学习软件测试?
- dell计算机的硬盘如何分区,戴尔电脑装完win10系统之后怎么分区?戴尔电脑win10系统分区步骤...
- linux mysql mysqld 启动_linux mysqld的启动过程
- 01 - 进阶操作系统(BIOS)