Qt tcp通信(客户端+服务器一对一)

学习自《Qt5.9 C++开发指南》

服务器端: 

QTcpServer *tcpServer; //TCP服务器
tcpServer=new QTcpServer(this);
connect(tcpServer,SIGNAL(newConnection()),this,SLOT(onNewConnection()));

当有新的客户端接入时,QTcpServer内部的incomingConnection()函数会创建一个与客户端相连的QTcpSocket对象,然后发射信号newConnection()。

tcpSocket = tcpServer->nextPendingConnection(); //创建socket

使用nextPendingConnection()接受客户端的连接,然后使用QTcpSocket与客户端通信。 

    connect(tcpSocket, SIGNAL(connected()),this, SLOT(onClientConnected()));

客户端socket连接建立时发射此信号 

void MainWindow::onClientConnected()
{//客户端接入时ui->plainTextEdit->appendPlainText("**client socket connected");ui->plainTextEdit->appendPlainText("**peer address:"+tcpSocket->peerAddress().toString());ui->plainTextEdit->appendPlainText("**peer port:"+QString::number(tcpSocket->peerPort()));
}
tcpSocket->peerAddress():对方socket的地址
tcpSocket->peerPort():对方socket的端口
    connect(tcpSocket, SIGNAL(disconnected()),this, SLOT(onClientDisconnected()));

 客户端socket连接断开时发射此信号

void MainWindow::onClientDisconnected()
{//客户端断开连接时ui->plainTextEdit->appendPlainText("**client socket disconnected");tcpSocket->deleteLater();//    deleteLater();//QObject::deleteLater();
}
    connect(tcpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));

本程序的socket状态变化时发射此信号

void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)
{//socket状态变化时switch(socketState){case QAbstractSocket::UnconnectedState:LabSocketState->setText("scoket状态:UnconnectedState");break;case QAbstractSocket::HostLookupState:LabSocketState->setText("scoket状态:HostLookupState");break;case QAbstractSocket::ConnectingState:LabSocketState->setText("scoket状态:ConnectingState");break;case QAbstractSocket::ConnectedState:LabSocketState->setText("scoket状态:ConnectedState");break;case QAbstractSocket::BoundState:LabSocketState->setText("scoket状态:BoundState");break;case QAbstractSocket::ClosingState:LabSocketState->setText("scoket状态:ClosingState");break;case QAbstractSocket::ListeningState:LabSocketState->setText("scoket状态:ListeningState");}
}

 

tcpSocket->state();

返回socket当前的状态

    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));

本程序的socket的读取缓冲区有新数据时发射此信号

void MainWindow::onSocketReadyRead()
{//读取缓冲区行文本
//    QStringList   lines;while(tcpSocket->canReadLine())ui->plainTextEdit->appendPlainText("[in] "+tcpSocket->readLine());
//        lines.append(clientConnection->readLine());
}

 

canReadLine():如果有行数据要从socket缓冲区读取,返回true
    QString     IP=ui->comboIP->currentText();//IP地址quint16     port=ui->spinPort->value();//端口QHostAddress    addr(IP);tcpServer->listen(addr,port);//
//    tcpServer->listen(QHostAddress::LocalHost,port);// Equivalent to QHostAddress("127.0.0.1").

 监听

    if (tcpServer->isListening()) //tcpServer正在监听{tcpServer->close();//停止监听}

停止监听

void MainWindow::on_btnSend_clicked()
{//发送一行字符串,以换行符结束QString  msg=ui->editMsg->text();ui->plainTextEdit->appendPlainText("[out] "+msg);QByteArray  str=msg.toUtf8();str.append('\n');//添加一个换行符tcpSocket->write(str);
}

tcpSocket向客户端发送信息

客户端:

QTcpSocket  *tcpClient;  //socket
tcpClient=new QTcpSocket(this); //创建socket变量
    QString     addr=ui->comboServer->currentText();quint16     port=ui->spinPort->value();tcpClient->connectToHost(addr,port);

以异步方式连接到指定IP地址和端口的TCP服务器,连接成功后会发射connected()信号 

    if (tcpClient->state()==QAbstractSocket::ConnectedState)tcpClient->disconnectFromHost();

断开socket,关闭成功后发射disconnected()信号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/2443.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust:遍历 BinaryHeap

Rust 的 BinaryHeap 结构体实现了迭代器接口,因此你可以遍历它。不过,由于 BinaryHeap 是一个优先队列,它默认是按照元素的优先级顺序(对于 MinBinaryHeap 是最小到最大,对于 MaxBinaryHeap 是最大到最小)来…

梯度,hesse阵与Jacobi矩阵

分清楚三个量的含义和计算方法。 梯度 表征的是一个列向量,是相对于某个方向而言的,但是某个方向上可能有多个变量,所以梯度不是简单的直接求偏导,并且说了,它是一个列向量,所以, 我们设 f : …

ArcGIS Pro 和 Python — 分析全球主要城市中心的土地覆盖变化科林

第一步——设置工作环境 1–0. 地理数据库 在下载任何数据之前,我将创建几个地理数据库,在其中保存和存储所有数据以及我将创建的后续图层。将为我要分析的五个城市中的每一个创建一个地理数据库,并将其命名为: “Phoenix.gdb” “Singapore.gdb” “Berlin.gdb” “B…

[论文笔记] EcomGPT:COT扩充数据的电商大模型

社区供稿 | EcomGPT:基于任务链数据的电商大模型(附魔搭推理实践) - 知乎 https://arxiv.org/pdf/2312.15696.pdf EcomInstruct指令数据集构建 数据集组成 COT方式构造垂域训练数据:把原本的垂域任务分解成了原子任务,构造了基于解决原子任务的数据。这样能用类似…

ThingsBoard教程(二十九):详细讲解在tb平台下 http协议下的客户端rpc,服务的rpc的使用

客户端rpc 先来说一下简单的客户端rpc, 客户端发起rpc请求,只需要使用post方法调用该接口即可以 http://host:port/api/v1/$ACCESS_TOKEN/rpc请求路径中间的参数 ACCESS_TOKEN 必须是设备的访问令牌。 请求携带的参数如下,二个参数method和params {"method": …

PHP 与 MySQL 数据库集成教程

当涉及到PHP与MySQL数据库的集成时,你需要执行几个步骤来设置连接并执行查询。下面是一个简单的PHP与MySQL集成教程,包括一段示例代码: 步骤 1:安装和配置MySQL数据库 首先,确保你已经安装了MySQL数据库,…

PyCharm开发工具安装plugins插件

一. 简介 通过前面的学习,我们知道 python开发常用的一个开发工具(即IDE)是 PyCharm。 本文来简单介绍一下,PyCharm开发工具是如何安装 plugins插件的。其实与 vscode软件安装插件类似。 本文来学习 PyCharm开发工具安装一个中…

深入浅出MySQL-02-【MySQL支持的数据类型】

前言 环境: Windows11MySQL-8.0.35 1.数值类型 MySQL中的数值类型,如下: 整数类型字节最小值最大值TINYINT1有符号 -128无符号 0有符号 127无符号 255SMALLINT2有符号 -32768无符号 0有符号 32767无符号 65535MEDIUMINT3有符号 -8388608…

table表格导出为excel文件并设置样式

table表格导出为excel文件并设置样式 安装xlsx、xlsx-style-medalsoft 的 npm 包: npm i xlsx xlsx-style-medalsoft设置全局: Vue.prototype.$XLSX XLSX; // 设置全局 Vue.prototype.$XLSXStyle XLSXStyle; // 设置全局具体代码实现: …

WordPress缓存插件有哪些?好用的缓存插件分享

目前WordPress缓存插件有:WP Rocket、WP Super Cache、W3 Total Cache、Sucuri、NitroPack、SiteGround Optimizer、LiteSpeed Cache、WP-Optimize、Hummingbird、Cache Enabler、Comet Cache。 在当今的数字世界中,拥有一个高效的网站对于吸引和留住用…

tomcat 配置支持 ssl 附效果图

1、修改tomcat配置文件server.xml: vim ./conf/server.xml 把配置文件&#xff1a; <Connector port"8088" Server" " protocol"HTTP/1.1"connectionTimeout"20000"redirectPort"8443" URIEncoding"UTF-8" …

维基百科、百度百科和搜狗百科词条的创建流程

随着网络的发展&#xff0c;百度百科、搜狗百科、维基百科等百科网站已经成为大众获取知识的重要途径。因为百科具有得天独厚的平台优势&#xff0c;百科上的信息可信度高&#xff0c;权威性强。所以百科平台也成为商家的必争之地。这里小马识途聊聊如何创建百度百科、搜狗百科…

Linux RTC驱动深入解析

目录标题 实时时钟&#xff08;RTC&#xff09;基础Linux内核中的RTC框架RTC设备类设备树&#xff08;Device Tree&#xff09; 编写Linux RTC驱动1. 初始化和注册2. RTC设备操作函数3. 清理函数 测试RTC驱动驱动开发的挑战总结 在许多嵌入式系统和服务器上&#xff0c;实时时钟…

NodeJs如何使用SQL模糊查询

最近在改一个比较久的项目&#xff0c;是使用nodejs写的&#xff0c;但是对于长期写java的后端开发来说&#xff0c;还是有点难维护&#xff0c;不过不改bug的话&#xff0c;就需要重新开发&#xff0c;所以只能慢慢看nodejs代码&#xff0c;测试人员提了一个需要支持模糊查询的…

Linux I2C(三) i2c bus/adapter/client_device注册

一&#xff0c;i2c总线注册 1&#xff0c;i2c_bus_type i2c_bus_type注册流程&#xff1a; //kernel\drivers\i2c\i2c-core-base.c postcore_initcall(i2c_init);retval bus_register(&i2c_bus_type); 注册之后生成i2c bus目录&#xff1a; /sys/bus/i2c # ls -l drw…

js 操作数组的方法

在 JavaScript 中&#xff0c;数组对象提供了多种方法来操作数组。以下是一些常用的数组操作方法&#xff0c;包括它们的详细代码示例&#xff1a; 1、push() - 向数组的末尾添加一个或多个元素&#xff0c;并返回新的长度。 let array [1, 2, 3]; array.push(4); // 添加单…

基于 Grassmannian Manifold的动态图嵌入学习的脑网络时空枢纽识别

Spatiotemporal Hub Identification in Brain Network by Learning Dynamic Graph Embedding on Grassmannian Manifold 摘要 神经成像技术的进步使得测量不同大脑区域之间的连接随时间演变成为可能。新出现的证据表明&#xff0c;一些关键的大脑区域&#xff0c;称为枢纽节点…

机器学习(四)之无监督学习

前言&#xff1a; 前面写了监督学习的几种算法&#xff0c;下面就开始无监督啦&#xff01; 如果文章有错误之处&#xff0c;小伙伴尽情在评论区指出来&#xff08;嘿嘿&#xff09;&#xff0c;看到就会回复的。 1.聚类&#xff08;Clustering&#xff09; 1.1 概述&#xff…

[Android]Jetpack Compose加载图标和图片

一、加载本地矢量图标 在 Android 开发中使用本地矢量图标是一种常见的做法&#xff0c;因为矢量图标&#xff08;通常保存为 SVG 或 Android 的 XML vector format&#xff09;具有可缩放性和较小的文件大小。 在 Jetpack Compose 中加载本地矢量图标可以使用内置的支持&…

FreeRTOS学习 -- 任务

一、什么是任务系统 单片机裸跑的时候一般都是在main函数里面用 while (1) 做一个大循环来完成所有的处理&#xff0c;即应用程序是一个无限的循环&#xff0c;循环中调用相应的函数完成所需的处理。这个就是单任务系统&#xff0c;也称为前后台系统&#xff0c;中断服务函数作…