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连接对象相关推荐

  1. 【TCP协议】主动方关闭连接后不能继续接收数据?

    如果你搜过TCP的四次挥手相关信息,你一定会看到类似这样的话:"主动方选择关闭连接后,被动方马上回ACK,此时可以继续传输数据,传完后再发送FIN" (图片来源:CS-Notes/ ...

  2. 计算机网络没有接收数据,本地连接有发送无接收数据的解决方法

    "本地连接"有发送无接收数据的解决方法 发布时间:2013-07-23 23:34:03   作者:佚名   我要评论 在日常的网络维护中,常常出现"本地连接" ...

  3. 手把手教你Android手机与BLE终端通信--连接,发送和接收数据

    假设你还没有看上一篇 手把手教你Android手机与BLE终端通信--搜索,你就先看看吧,由于这一篇要接着讲搜索到蓝牙后的连接.和连接后的发送和接收数据. 评论里有非常多人问假设一条信息特别长,怎么不 ...

  4. qt 一个线程接收数据 主线程更新界面 会造成界面退出 怎么解决_打造一个好产品...

    编辑导语:一个好的产品,关键在于产品经理和团队:产品经理对于产品如何理解以及产品更新迭代时的需求变化,产品如何实现更好的体验等等:本文作者分享了关于产品经理经常犯的七个问题,我们一起来看一下. 不管怎 ...

  5. Oracle 跨库查询表数据(不同的数据库间建立连接)

    1.情景展示 当需要从A库去访问B库中的数据时,就需要将这两个库连接起来: 两个数据库如何实现互联互通,在oracle中,可以通过建立DBLINK实现. 2.解决方案 2018/12/05 第一步:创 ...

  6. html页面跨域提交数据,前端跨域的整理

    跨域整理 1. 跨域资源共享 CORS 对于web开发来讲,由于浏览器的同源策略,我们需要经常使用一些hack的方法去跨域获取资源,但是hack的方法总归是hack.直到W3C出了一个标准-CORS- ...

  7. oracle跨库插入数据,Oracle跨数据库查询并插入实现原理及代码

    工作中需要从一个数据库中的表GIS_WEICHAI_DATA_1S中的数据导入到另个一数据库的表GIS_WEICHAI_DATA_1S中,数据库服务器都是远程的!我的实现方法是在本地使用PL/SQL操 ...

  8. 使用c#实现tcp的连接和发送接收数据

    最近有个小项目,需要调用装置的录波数据,使用tcp模式,在这里整理了下如何使用c#实现tcp连接并实现发送接收数据,分享出来. 我这里使用的tcpclient ,终端是tcpserver模式. 首先自 ...

  9. 无线网络连接后总是提示可能需要其他登陆信息

    无线网络连接后总是提示可能需要其他登陆信息,但网络已连接可以上网. 运行(开始菜单键+R)输入 regedit 回车打开注册表编辑器. 找到注册表键值HKEY_LOCAL_MACHINE\SYSTEM ...

最新文章

  1. java不可编辑的文本框_如何使编辑文本不可编辑,但在JAVA中可点击
  2. 《Windows 系列》- 右击添加管理员权限
  3. SpringMVC+uploadify文件上传
  4. C++ 读取结束的判断
  5. 浙大计算机学院吴飞,浙江大学吴飞教授来我院作人工智能学术报告
  6. pandas学习笔记三之赋值操作
  7. box-sizing 的作用
  8. Unity资源打包之Assetbundle
  9. 一名清华考研者自诉:福昕PDF阅读器APP让我找回希望
  10. python爬虫之模拟登陆(CSDN篇)
  11. 分享一下免费的ppt网站(好看,免费)
  12. MacBook M1 虚拟机安装Windows7 Xp
  13. 运维简历怎么写项目描述_简历中的项目描述
  14. 知识点滴 - 关于苹果认证MFI
  15. uniapp H5嵌套通讯方案-webviewiframe
  16. 盘点2021款iPad Pro 5个增强功能,与上一代有什么区别?
  17. 1000!末尾 有几个0
  18. 省协湖北中心 计算机科学与技术,国家知识产权局专利局专利审查协作湖北中心...
  19. App 性能测试分享
  20. 数字化智能工厂解决方案47页

热门文章

  1. Linux下快速查看CPU使用情况的相关命令
  2. Spring 入门教程
  3. GitHub开源:升讯威微信营销系统(第三方微信平台)完整源代码
  4. ms10_018漏洞利用实践
  5. 泛微京桥通集成SAP,让采购流程闭环、业务管理一体化
  6. 国密算法SM4 的JAVA实现(基于BC实现)
  7. 零基础如何入门和学习软件测试?
  8. dell计算机的硬盘如何分区,戴尔电脑装完win10系统之后怎么分区?戴尔电脑win10系统分区步骤...
  9. linux mysql mysqld 启动_linux mysqld的启动过程
  10. 01 - 进阶操作系统(BIOS)