Qt TCP通信(QTcpSocket)

这篇具有很好参考价值的文章主要介绍了Qt TCP通信(QTcpSocket)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 用法

下面以初始化、连接、写、读、断开连接这几个部分来介绍QTcpSocket的用法。
假设在xxx类实现tcp通信。

初始化

/* 初始化 */
void xxx::init() {
	m_socket = new QTcpSocket(this);

	/*下面是几种常用的信号,更多的信号可以查看QAbstractSocket和QIODevice文档*/
	connect(m_socket, &QTcpSocket::connected, this, [] () {
		qDebug() << "socket已连接";
	});

	connect(m_socket, &QTcpSocket::disconnected, this, [] () {
		qDebug() << "socket已断开连接";
	});

	connect(m_socket, &QTcpSocket::stateChanged, this, [] (QAbstractSocket::SocketState socketState) {
		qDebug() << "socket状态改变" << socketState;
	});

	connect(m_socket, &QTcpSocket::readyRead, this, [] () {
		qDebug() << "有数据可读";
	});
}

连接

/* 初始化 */
bool xxx::connect() {
	m_socket->connectToHost(m_ip, m_port); //连接
	
	/* 等待连接完成,设置连接超时为500ms,超时视为连接失败 */
    return m_socket->waitForConnected(500); 
}

发送

/* 发送数据 */
bool xxx::send(const QByteArray &byteArray) {
	if (m_socket->write(byteArray) == -1) {
		/* 写数据时出现错误 */
		qDebug() << m_socket->errorString(); //错误的详情
		return false;
	}

    if (!m_socket->waitForBytesWritten(500)) {//等待发送完毕,设置超时时间500ms
        /* 限定时间内没发完 */
        return false;
    }
	
	return true;
}

接收

/* 接收数据 */
QByteArray xxx::receive() {
	/* readAll返回空的数据不一定代表有错,该方法无法判断是否出错 */
	return m_socket->readAll();
}

断开连接

/* 接收数据 */
void xxx::disconnect() {
	/** 写法一 
	 * 该方法调用后会开始断开连接。
	 * 要注意的是,调用这个方法后,不会马上断开连接,
	 * 它会等待数据写入完成后才会真正断开,如果数据一直写不完就一直断不开
	 * 比如拔了网线,就一直写不进去,这时候调用这个方法是无效的,
	 * socket状态一直为ClosingState。
	 */
	m_socket->disconnectFromHost();	//

	/** 写法二 
	 * 该方法调用后会立马断开连接。
	 */
	m_socket->abort();  
	
}

2.应用

判断连接是否断开

1、发送数据时,一次或多次发送超时,可以判断为断开连接。
2、心跳包检测(每隔一段时间发送一条无意义的数据,根据发送结果确认连接状态),TCP连接一般都要加上这条,不然如果长时间无数据发送,连接会被自动关闭。
注:检测到断开连接最好调用abort来断开socket上的连接,原因在上一节已有说明。

同步操作

QTcpSocket的方法是异步的,调用了函数,不会马上返回结果,Qt通过信号来异步返回结果,但有时候需要同步得到结果,对此,QTcpSocket提供了以下函数,可以阻塞线程,直到指定的信号被触发。文章来源地址https://www.toymoban.com/news/detail-506792.html

bool waitForConnected(int msecs = 30000); //阻塞线程,直到连接完成或超时。
bool waitForReadyRead(int msecs = 30000); //阻塞线程,直到有新数据可读取或超时。
bool waitForBytesWritten(int msecs = 30000); //阻塞线程,直到数据被写入socket或超时。
bool waitForDisconnected(int msecs = 30000); //阻塞线程,直到断开连接或超时。

到了这里,关于Qt TCP通信(QTcpSocket)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习参数初始化(二)Kaiming初始化 含代码

    目录 一、介绍 二、基础知识 三、Kaiming初始化的假设条件  四、Kaiming初始化的简单的公式推导 1.前向传播 2.反向传播 五、Pytorch实现 深度学习参数初始化系列: (一)Xavier初始化 含代码 (二)Kaiming初始化 含代码         Kaiming初始化论文地址:https://arxiv.org/abs/1502.01

    2024年02月04日
    浏览(78)
  • 【随机种子初始化】一个神经网络模型初始化的大坑

    半年前写了一个模型,取得了不错的效果(简称项目文件1),于是整理了一番代码,保存为了一个新的项目(简称项目文件2)。半年后的今天,我重新训练这个整理过的模型,即项目文件2,没有修改任何的超参数,并且保持完全一致的随机种子,但是始终无法完全复现出半

    2024年02月09日
    浏览(69)
  • 初始化磁盘选哪个格式 初始化磁盘分区形式选什么好

    在 初始化磁盘 之前,我们应该先明确什么时候需要初始化磁盘,通常是在电脑安装了SSD固态硬盘,计算机无法正常读取该固态硬盘时。或者需要腾空移动磁盘,以做它用时。那么初始化磁盘时,有哪些格式呢?如今主流的是NTFS格式。也有FAT 32格式,但读写性能会比较差。

    2024年02月09日
    浏览(49)
  • c# 初始化列表,并给列表里面所有的元素进行初始化

    Enumerable.Repeat 方法是用于生成一个包含指定元素重复若干次的序列。它接受两个参数,第一个参数是要重复的元素,第二个参数是重复次数。 下面是 Enumerable.Repeat 方法的用法和示例:

    2024年02月13日
    浏览(48)
  • 官答|初始化GreatSQL报错无法找到数据目录或初始化数据字典失败

    GreatSQL推出新栏目——官答 官答栏目针对GreatSQL数据库中的问题,选取官方论坛和讨论群中的典型提问进行深入解答。内容涵盖数据库安装部署、配置优化、故障排查、性能测试等方面。 在文章中,我们不仅提供解决方案,还会结合实例深入剖析问题的成因,提升读者对GreatSQL数据

    2024年02月04日
    浏览(64)
  • media设备节点初始化与Video4Linux初始化

    media_devnode_init函数是一个内核初始化函数,用于在Linux内核启动期间进行设备节点初始化。 函数的主要作用是创建媒体设备节点(device node)并将其注册到系统的设备树中。媒体设备节点用于表示媒体设备(如摄像头、音频设备等),它们在/dev目录下以特定的名称存在,并允

    2024年02月05日
    浏览(44)
  • C语言字符串初始化详解:用常量字符串进行字符数组初始化

    简介 字符串初始化 用常量字符串 初始化过程 示范代码 结论 在C语言中,字符串被定义为字符数组。字符串的初始化是指将一个常量字符串复制到字符数组中。本文将详细介绍字符串的初始化方法,并提供相应的示范代码。 在C语言中,有几种常用的方法可以用常量字符串来

    2024年02月15日
    浏览(60)
  • 神经网络:初始化

    初始化在计算机视觉中是指对神经网络模型的参数进行初始赋值的过程。它的作用是为模型提供一个良好的起点,以便更快地收敛到较好的解,并避免梯度消失或梯度爆炸等问题。以下是从数学角度解释初始化的原理和意义: 原理: 神经网络的参数通常以矩阵的形式表示,

    2024年02月10日
    浏览(49)
  • vue中初始化

    主要是挂载一些全局方法 响应数据相关的Vue.set, Vue.delete, Vue.nextTick以及Vue.observable 插件相关的Vue.use 对象合并相关Vue.mixin 类继承相关的Vue.extend 资源相关,如组件,过滤器,自定义指令Vue.component, Vue.filter, Vue.directive 配置相关Vue.config以及Vue.options中的components,filters,directives 定

    2023年04月22日
    浏览(49)
  • MYSQL的初始化

    #一 MYSQL安装后 应该进行初始化 ##首先配置好环境变量 在 此电脑 中的 属性 配置信息如下 ## 初始化MYSQL 在mysql的根目录中创建一个my.ini的文档 my.ini的文本内容如下(直接复制即可) [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 default-storage-engine=INNODB #二、配置Data ##用

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包