Qt线程中使用Socket作为客户端通信

Qt QTcpSocket 客户端设计(自动重连、多线程处理、发送大数据包、同步方式) 1.问题说明 使用Qt编写TCP客户端时,需要完成自动重连服务器,实际使用中开启了一个线程用于断线重连操作和其他自动发送任务等。 初始化: m_tcpClient = new QTcpSocket(this); m_tcpClient->abort();//取消原有连接 connect(m_tcpClient,SIGNAL(readyRead()),this,SLOT(ReadMessage())); connect(m_tcpClient,SIGNAL(disconnected()),this,S 阅读详情

在编写一般程序中,通常将通信部分与数据处理部分单独放到一个线程或进程(Python由于GIL锁需要使用进程),这样可保证程序的快速响应,数据处理不会对其他部分造成影响。

在Qt中使用线程有两种方式:一种是继承QThread,重新实现run()函数。此时要注意,只有run()函数里面的才是单独运行到线程中的。通常在run()函数中使用while()循环或for循环与队列配合,让线程一直处理请求。另一种是使用moveToThread()函数将对象移到子线程中,moveToThread()函数之后再做说明,本次主要说明使用QThread时遇到的问题。

这是传说中的UI。。。 ~ ~。。。

 

 

 

一些程序:

 

#ifndef THREADSOCKET_H

#define THREADSOCKET_H

 

#include <QThread>

#include <QTcpSocket>

 

 

class ThreadSocket : public QThread

{

    Q_OBJECT

 

public:

    ThreadSocket();

 

    void start_thread();

 

public slots:

    void slot_readmesg();

    void slot_WritMsgToServer(QString str);

 

protected:

    void run();

 

private:

    QTcpSocket *mp_clsTcpSocket;

    bool couldReadData;

};

 

#endif // THREADSOCKET_H

 

#include "threadsocket.h"

#include <QDebug>

 

ThreadSocket::ThreadSocket():

    QThread(),

    couldReadData(false)

{

    qDebug() << "parent this id" << this;

}

 

void ThreadSocket::start_thread()

{

    if(!this->isRunning())

        this->start();

}

 

void ThreadSocket::slot_readMsgFromServer()

{

    couldReadData = true;

    QByteArray buffer = mp_clsTcpSocket->readAll();

    qDebug() <<"msg:"<< buffer;

 

}

 

void ThreadSocket::slot_WritMsgToServer(QString str)

{

    mp_clsTcpSocket->write(str.toLatin1());

}

 

void ThreadSocket::run()

{

    mp_clsTcpSocket = new QTcpSocket();

 

    mp_clsTcpSocket->connectToHost("192.168.18.77",2115);

    connect(mp_clsTcpSocket,SIGNAL(readyRead()),this, SLOT(slot_readMsgFromServer()));

 

    if (mp_clsTcpSocket->waitForConnected(1000))

    {

        qDebug() << "connect success !";

    }else{

        qDebug() << "connect faild !";

    }

 

    while(1)

    {

        qDebug() << "__________________";

        mp_clsTcpSocket->write("test\n");

        mp_clsTcpSocket->flush();

 

        qDebug() << "couldReadData" << couldReadData;

 

        if (true == couldReadData)

        {

            QByteArray buffer = mp_clsTcpSocket->readAll();

            qDebug() <<"receive server msg:"<< buffer;

 

            couldReadData = false;

        }

 

        sleep(1);

②//        exec();

 

    }

 

}

 

简单说下程序构成:所贴代码主要是线程中的socket接收与发送测试代码。主UI中有两个按钮,一个是启动线程,另一个是在通过信号槽向服务器发送数据。

在run()函数中实例化客户端,注意不要传入this指针,否则会报如下错误:QObject: Cannot create children for a parent that is in a different thread.【QObject:无法为位于不同线程中的父级创建子级。】

这样客户端就存在与子线程中,同样在run()中连接信号和槽。注意此时的this是父类的this,即信号与槽位于不同的线程。这是第一个值得注意的地方。

第二该测试中,需要在客户端write()后加flush(),否则客户端无法发送数据。这是第二个需要注意的地方。

第一种测试:

运行该测试程序,可以在run()中向服务器发送数据,但是无法在主UI通过信号和槽的方式向服务器发送数据。点击Send按钮,报错如下:QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread.【QSocketNotifier:无法从另一个线程启用或禁用套接字通知程序】。服务器向客户端发送数据,客户端接收不到,connect()函数返回True,说明信号与槽连接成功。这是上述测试程序的运行结果。

第二种测试:

在sleep(1)后加入 exec()函数,while()循环只执行一次,客户端槽函数可以接收服务器发出的数据。但在主UI中依然无法向服务器发送数据。

这次的内容只描述两种测试结果,接下来的其他内容将逐步剖析这些情况的原因。

一起学习,共同进步。我们都是奋斗者!

 

***********************    update   *******  2019 09 07********************

结论也就是无法通过这种方式在线程中使用socket。不过可以通过moveToThread的方式实现:

qt线程中使用socket的正确打开方式

***********************    update   *******  2019 09 07********************

 

欢迎大家关注我的公众号!

QThread内创建QUDPSocket接收并处理数据 QThread内创建QUDPSocket接收并处理数据前言connect函数与QThread方案 前言 最近做项目,与仿真机通信。仿真机发送数据频率为1毫秒,导致Qt上位机在主线程频繁接收数据,造成界面卡死,因此将整个udp的通信和解析都放在线程中进行。 connect函数与QThread connect函数最后一个参数指定了三种连接方式:自动模式、直连模式和队列模式。自动模式下,是使用的直连模式还是队列模式,主要看信号发出者和槽接收者是否在同一线程。 如果sender和reciver对象在同一线程中被创 阅读详情

相关推荐

Android(客户端)通过socket与QT(服务端)通信

一、概述在这里我想实现一个跨平台的socket通讯,Android手机作为客户端向Ubuntu的QT平台上的服务端发送一个字符命令,由于是只发送一个字符,这里我尽可能简化socket通讯的过程以供后人参考。 文中贴上主要代码,末尾会给出完整源代码的下载。二、QT的服务端QT上的服务端我使用了QTcpServer和QTcpSocket类,大体的流程是这样的: 1、主窗口进入UI 2、启动TcpS

张京林要加油的技术专栏 8174

网络通信/QTcpSocket/实现一个可在子线程中发送和接收数据的TCP客户端

基于QTcpSocket类实现一种可在子线程中收发数据的TCP客户端程序。验证了,如果一个Tcp对象被移动到子线程X中,那么其readyRead、connected、disconnected信号等都将从子线程X中发出。

Dahe.qu 9797

Qt中跨进程Socket通信以及socket跨线程通信

主线程创建的socket套接字对象,传入到子线程中,可能因为qt版本或者windows平台问题,日志可能会报主线程创建的socket对象不能在子线程工作。qt中server间跨线程通信时,要保证socket对象的创建与使用线程一致,不能在主线程创建,通过指针传递给子线程进程使用,正确做法是重写socketServer中的incommingConnetction()方法,与客户端连接请求进行设定匹配,即创建一个QTcpServer派生的server类,并重写incomingConnection方法。

QtCompany的博客 679

QT子线程使用QTcpSocket

子线程中使用QTcpSocket

南北粉面馆 1332

5、QT的使用——TCP客户端和服务器

TCP客户端和服务器

weixin_45981798的博客 2266

实现Socket5协议的简易客户端

Socket5协议作为网络代理通信协议的一种,主要用于在客户端和服务器之间建立代理连接,从而实现数据的转发。它允许客户端通过代理服务器访问网络资源,同时隐藏客户端的真实IP地址,增加了网络交互的安全性。Socket5是Socket4的改进版,支持更多的连接类型和认证机制,广泛应用于网络加速和网络匿名等领域。QTcpSocket是Qt框架中的一个类,用于在TCP/IP协议的基础上提供网络通信的客户端支持。它允许开发者轻松创建和管理TCP连接,发送和接收数据,处理网络事件和异常。

weixin_33363025的博客 1031

19.Qt中Thread线程中创建QTcpSocket

Thread线程中创建QTcpSocket 本文承接上一篇博文,Qt线程创建,本文记录在线程中创建socket 套接字,连接服务器进行编程. /********************************************************************************************** * ThreadRecvData.cpp * 描述:本线程类主要功能实现从服务器接收数据. * 作者:xhome * 时间:2020/5/8 ****************

写给自己的笔记 2895

Qt Socket 多线程代码实现

自已用Qt写的多线程服务器实现功能,用QtcpSocket进行通讯,可以正常编译运行,很适合初学者学习使用;

Qt线程中使用socket作为客户端通信(二)

Qt使用线程的方式有两种,一种是上次所说的继承QThread重新实现run()函数,在run()函数中一直循环处理;另一种则是继承QObject并使用moveToThread()函数将对象移到子线程中。由于继承QThread方式使用的并不规范,Qt官方强烈建议使用继承QObject的方式。 根据之前编写程序得到的结果,在相对复杂的UI设计中,如果socket通信放在住UI中,并且让服务器每间隔1...

Pou光明的博客 2443

使用vite+react+ts+Ant Design开发后台管理项目(四)

本文将引导开发者从零基础开始,运用、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈,构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导,文章旨在为开发者揭示如何利用这些技术工具,从项目构思到最终实现的全过程,提供清晰的开发思路和实用的技术应用技巧。使用vite+react+ts+Ant Design开发后台管理项目(一)使用vite+react+ts+Ant Design开发后台管理项目(二)

lbking666666的专栏 2007

高精地图语义分割标注

什么是语义分割?语义分割与目标检测的区别?语义分割的关键应用场景有哪些?高精地图语义分割标注的难点?

weixin_52509513的博客 1646

编程例子-Qt多线程的socket客户端与Qtsocket服务端

编程例子-Qt多线程的socket客户端与Qtsocket服务端 去发现同类优质开源项目:https://gitcode.com/ 此仓库包含了两个编程示例:一个Qt多线程的socket客户端和一个Qtsocket服务端。以下是对这些资源的详细描述: 资源描述 Qt多线程的socket客户端: 此示例基于原书中的例子,我们添加了客户端多线程的功能,使得客户端可以同时开启多个线程进行网络通信,提...

gitblog_06744的博客 613

Stata实战:RCS限制立方样条非线性关系建模与P值解读全攻略

本文详细介绍了在Stata中使用RCS限制立方样条进行非线性关系建模的全过程,包括数据准备、节点设置、COX回归模型构建、结果可视化及P值解读。通过乳腺癌临床数据实例,展示了如何捕捉年龄与死亡风险之间的复杂非线性关系,并提供了实用的Stata代码和图形优化技巧。

weixin_30650039的博客 472

基于QT的Socket TCP通信示例(原创)

基于QT的Socket TCP通信示例(原创) 【下载地址】基于QT的SocketTCP通信示例原创 本资源文件提供了一个基于QT的Socket TCP协议通信示例,包含客户端与服务端。该示例实现了多线程、心跳机制、断线重连以及数据简单封包(防止粘包)等必备技巧。所有功能已经封装为独立的类,具有较强的移植性,用户只需添加...

gitblog_09722的博客 897

Echats-wordcloud 文字云图的踩坑点【Unknown series wordCloud】

一直都是报 【ECharts Unknown series wordCloud】这玩意可能要刷脸,祝你好运吧~

Sky_Bug的博客 2418

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 346

从零开始用QT编写一个Android投屏、PC反控软件(三)--线程与socket基础

用qt开发一款android投屏、反控软件

光音的故事 1413

霍尔式流量计背后的技术和算法

例如,在一项实验中,当流量低于最小操作范围(0.250 L/min)时,误差比其他流量大,但仍然在95%的精度范围内可接受。例如,在Honeywell电子学的测试中,使用30英寸水柱的压力计和热电偶测量气体特性,记录并计算实际和理论质量流量,以确定修正系数。霍尔式流量计的校准系数是通过一系列精确的测量和计算步骤确定的,以确保其测量结果的准确性和可靠性。霍尔式流量计的校准系数是通过严格的环境条件、精确的测量步骤和实验数据确定的。其中,Qs是标尺介质的流量,K是修正系数,Qm是用户介质的流量。

百态·数智思维 | 聚焦大数据、量化与未来AI 1234

qt中socket通信流程图_在Qt的多线程网络通信中一个TCPSocket怎么实现读和写?

关键部分代码这是服务器的代码,对run函数的重新实现;voidTcpThread::run(){tcpSocket=newQTcpSocket;//将Server传来的socketfd与刚创建的tcpSocket关联if(!tcpSocket->setSocketDes...关键部分代码这是服务器的代码,对run函数的重新实现;void TcpThread::run(){ tcpSoc...

weixin_42498055的博客 790

【光子 AI 】应用 LangGraph 的核心模型和算法原理,完整实现一个极简版的 Agent 开发框架源代码,并给出具体的应用测试实际项目案例

下面给出一个“极简版 LangGraph 风格 Agent 框架”的完整可运行实现:用 有向图 + 状态(State) + 节点(Node) + 条件路由(Conditional Edge) + 循环(Loop) + Checkpoint 这一套核心模型/算法,把 Agent 组织成可编排、可测试的状态机工作流(这正是 LangGraph 的核心抽象之一:以 StateGraph 组织节点,节点读写共享状态,边做路由与循环,并支持持久化/回放)。 参考概念来源:LangGraph 官方文档对 “StateG

AI天才研究院 270

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

QT-3.4 socket编程

Introduction You can find the original German version of this tutorial written by forum member anda_skoa here. This tutorial gives an example of the use of eventloop based Qt socket classes. Eventlo

弹琴的企鹅 1272

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Python Socket通信(多线程通信、文件传输、Pyside2)

总结一下问题吧: 1.服务端保持通信需要一个无限循环来维持,而图形化界面的维持也需要一个无限循环来维持,一个无限循环套一个无限循环显然是不可能的,所以我使用到了QT中的Signal(信号)和slot(槽)的概念。 2.图形化界面就是简单qt designer,也没有很复杂的设计,但是学习了qt中读取文件和进度条的知识点,但是只是很简单的实现没有深入挖掘,所以这两个部分有很多的bug,之后有时间就改一下吧。 3.文件传输和信息通信很难放在一个socket中,我的感觉是因为文件传输后要关闭socket才能顺利接

qq_46629731的博客 3124

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

使用c/c++实现多线程TCP通信

本文讲到的是c和c++的tcp通信的代码实现过程,具体原理不做描述,如三次握手四次挥手。 服务器: 1、定义文件描述符,套接字结构体sockaddr_in。 2、创建socket(AF_INET,SOCK_STREAM,0)和给文件描述符赋值; 3、套接字结构体置0,bzero获取memset实现。 4、设置套接字结构体,分别有地址类型,端口和ip,注ip和端口的赋值涉及到字节序转换,需要用到htons,htonl,inet_addr等函数。 5、绑定文件描述符和套接字结构体。bind函数实现。 6、监听客

weixin_43246170的博客 6803

QT4中构建多线程的服务器and QT'Socket

QT4中构建多线程的服务器 出错和经验 2009-04-28 15:43:48 阅读12 评论0   字号:大中小 订阅 QT4中构建多线程的服务器 首先说一下对多线程这个名词的理解过程。以前听说过很多次多线程这个词,而且往往与服务器联系起来,因此一直把多线程误解为服务器特有的功能;直到这次课程设计,仔细学习了一下多线程的机制,才知道真正的意思。简单的来说,就是同时有多个线程一起

ASKLW的博客 542

QT分析之网络编程(1--4)

QT分析之网络编程(一)  首先对Windows下的网络编程总结一下: 如果是服务器,其WinSDK调用分别为: WSAStartup() -> socket() -> htons() / htonl() -> bind() -> listen() -> accept() -> recv() / send() -> closesocket() -> WSACleanup()

wjs1033的专栏 2949
上一篇: 你有什么道理后悔没有早点知道?
下一篇: Qt线程中使用socket作为客户端通信(二)
Pou光明
博客等级 码龄12年 3701粉丝 398原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值