QT网络调试助手

QT网络调试助手

  •  1.开发流程
  •  2.QTtcp服务器
    •    1.1 服务端数据读取
    •    1.2 服务端发送数据-所有客户端
    •    1.3 服务端自动刷新ip地址
    •    1.4 服务端检测客户端断开状态
    •    1.5 服务端发送数据-指定特定客户端发送数据
    •    1.6 服务端停止监听和断开
  •  3.QTtcp客户端

 1.开发流程

在这里插入图片描述

 2.QTtcp服务器

	1.添加网络访问权限QT += network2.创建一个新对象server = new QTcpServer(this);3.当监听按钮按下后开始监听
void Widget::on_btnListen_clicked()
{//2.监听:bool QTcpServer::listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0)   8888-15000//QHostAddress addr("192.168.0.101");port = ui->lineEditPort->text().toUInt();if(!server->listen(QHostAddress(ui->comboBoxAddr->currentText()),port)){    //自动检测ip地址:QHostAddress::AnyQMessageBox msgBox;msgBox.setWindowTitle("监听失败");msgBox.setText("端口号被占用");msgBox.exec();return;}ui->btnListen->setEnabled(false);ui->btnLineOut->setEnabled(true);ui->btnStopListen->setEnabled(true);ui->btnSend->setEnabled(true);//qDebug() << QHostAddress(ui->comboBoxAddr->currentText());
}4.监听到新的newConnection()信号后对新的连接进行处理connect(server,SIGNAL(newConnection()),this,SLOT(on_newClient_connect()));void Widget::on_newClient_connect()
{//所有的数据操作都是TcpSocket进行//bool QTcpServer::hasPendingConnections() const    有新的连接返回Trueif(server->hasPendingConnections()){//QTcpSocket *QTcpServer::nextPendingConnection()   返回下个连接来的connectQTcpSocket *connection = server->nextPendingConnection(); //获得到的客户端连接信息都在connection里,并将信息也保存在server中qDebug() << "client addr: " <<connection->peerAddress().toString() <<",port: " << connection->peerPort();ui->textEditRev->insertPlainText("客户端地址:" + connection->peerAddress().toString()+"\n客户端端口号:" + QString::number(connection->peerPort())+ "\n");connect(connection,SIGNAL(readyRead()),this,SLOT(on_readyRead_handler()));//断开后信号:void QAbstractSocket::disconnected()//connect(connection,SIGNAL(disconnected()),this,SLOT(mdisconnected()));//void QAbstractSocket::stateChanged(QAbstractSocket::SocketState socketState)connect(connection,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(mstateChanged(QAbstractSocket::SocketState)));ui->comboBoxChildren->addItem(QString::number(connection->peerPort()));ui->comboBoxChildren->setCurrentText(QString::number(connection->peerPort()));if(!ui->btnSend->isEnabled()){ui->btnSend->setEnabled(true);}}
}

   1.1 服务端数据读取

	connect(connection,SIGNAL(readyRead()),this,SLOT(on_readyRead_handler())void Widget::on_readyRead_handler()
{QTcpSocket *tmpSocket = qobject_cast<QTcpSocket *>(sender());  //获得信号的发出者QByteArray RevData = tmpSocket->readAll();ui->textEditRev->insertPlainText("客户端:" + RevData + '\n');ui->textEditRev->moveCursor(QTextCursor::End);  //将读取光标移动至尾部ui->textEditRev->ensureCursorVisible(); //确定光标可见
}

   1.2 服务端发送数据-所有客户端

on_newClient_connect()中QTcpSocket *connection = server->nextPendingConnection(); 会将信息也保存在server中,server是全局变量,对server来说,每一个socket都是server的child所以通过其父类QObject的FindChildren可以找到所有的socket
}void Widget::on_btnSend_clicked()
{//QTcpSocket *connection = server->nextPendingConnection(); //获得到的客户端连接信息都在connection里,并将信息也保存在server中QList<QTcpSocket *> tcpSocketClients = server->findChildren<QTcpSocket *>();for(QTcpSocket *tmp : tcpSocketClients){//ui->textEditSend->toPlainText().toStdString().c_str()--先将QString转换成标准的c++字符串,再转换成const char*型tmp->write(ui->textEditSend->toPlainText().toStdString().c_str());}
}

   1.3 服务端自动刷新ip地址

	QNetworkInterfaceQList<QHostAddress> QNetworkInterface::allAddresses()//QList<QHostAddress> QNetworkInterface::allAddresses()QList<QHostAddress> address = QNetworkInterface::allAddresses();    //获取地址for(QHostAddress tmp : address){if(tmp.protocol() == QAbstractSocket::IPv4Protocol) //将ipv4的地址刷入comboxui->comboBoxAddr->addItem(tmp.toString());}

   1.4 服务端检测客户端断开状态

注:每次一断开之后必须清空通道即deleteLater();否则server中会一直保留该通道1.信号:void QAbstractSocket::disconnected()	connect(connection,SIGNAL(disconnected()),this,SLOT(mdisconnected()));void Widget::mdisconnected()
{QTcpSocket *tmpSocket = qobject_cast<QTcpSocket *>(sender());  //获得信号的发出者qDebug() << "client Out";ui->textEditRev->insertPlainText("客户端断开! ");tmpSocket->deleteLater();}2.信号:void QAbstractSocket::stateChanged(QAbstractSocket::SocketState socketState)void Widget::mstateChanged(QAbstractSocket::SocketState socketState)
{QTcpSocket *tmpSocket = qobject_cast<QTcpSocket *>(sender());  //获得信号的发出者switch(socketState){case QAbstractSocket::ClosingState://case QAbstractSocket::UnconnectedState:ui->textEditRev->insertPlainText("客户端断开! ");tmpSocket->deleteLater();break;}
}

   1.5 服务端发送数据-指定特定客户端发送数据

	1.因为ComboBox不提供鼠标点击刷新事件,因此需要重写ComboBox的鼠标点击事件和信号void MyComboBox::mousePressEvent(QMouseEvent *e)
{if(e->button() == Qt::LeftButton){emit ComboBox_clicked();}QComboBox::mousePressEvent(e);
}2.将控件提升为MyComboBox,并绑定信号与槽connect(ui->comboBoxChildren,&MyComboBox::ComboBox_clicked,this,&Widget::MyComboBox_refresh);//刷新ComboBox控件内容---为ComboBox添加接入的端口void Widget::MyComboBox_refresh()
{ui->comboBoxChildren->clear();QList<QTcpSocket *> tcpSocketClients = server->findChildren<QTcpSocket *>();for(QTcpSocket *tmp : tcpSocketClients){ui->comboBoxChildren->addItem(QString::number(tmp->peerPort()));}ui->comboBoxChildren->addItem("all");
}2.重写发送
void Widget::on_btnSend_clicked()
{//QTcpSocket *connection = server->nextPendingConnection(); //获得到的客户端连接信息都在connection里,并将信息也保存在server中QList<QTcpSocket *> tcpSocketClients = server->findChildren<QTcpSocket *>();if(tcpSocketClients.isEmpty()){QMessageBox msg;msg.setText("当前无连接");msg.exec();ui->btnSend->setEnabled(false);return ;}if(ui->comboBoxChildren->currentText() != "all"){QString currentname = ui->comboBoxChildren->currentText();for(QTcpSocket *tmp :tcpSocketClients){if(QString::number(tmp->peerPort()) == currentname){tmp->write(ui->textEditSend->toPlainText().toStdString().c_str());}}}else{for(QTcpSocket *tmp : tcpSocketClients){//ui->textEditSend->toPlainText().toStdString().c_str()--先将QString转换成标准的c++字符串,再转换成const char*型tmp->write(ui->textEditSend->toPlainText().toStdString().c_str());}}
}

   1.6 服务端停止监听和断开

void Widget::on_btnStopListen_clicked()
{QList<QTcpSocket *> tcpSocketClients = server->findChildren<QTcpSocket *>();for(QTcpSocket *tmp : tcpSocketClients){tmp->close();}server->close();ui->btnListen->setEnabled(true);ui->btnLineOut->setEnabled(false);ui->btnStopListen->setEnabled(false);
}void Widget::on_btnLineOut_clicked()
{on_btnStopListen_clicked();delete server;this->close();
}

 3.QTtcp客户端

	客户端逻辑相对简单直接上代码:
void Widget::on_pushButtonConnect_clicked()
{//void connectToHost(const QHostAddress &address, quint16 port, QIODevice::OpenMode openMode = ReadWrite)client->connectToHost(ui->lineEditIp->text(),ui->lineEditPort->text().toUInt());	//连接服务器timer = new QTimer(this);timer->setSingleShot(1);timer->setInterval(5000);connect(timer,SIGNAL(timeout()),this,SLOT(onTimerOut()));connect(client,SIGNAL(connected()),this,SLOT(onConnected()));//void QAbstractSocket::error(QAbstractSocket::SocketError socketError)connect(client,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onError(QAbstractSocket::SocketError)));this->setEnabled(false);timer->start();
}void Widget::mread_data_from_server()
{setInsertColor(Qt::black, "服务器:"+ client->readAll());
}void Widget::on_btnSend_clicked()
{QByteArray sendData = ui->textEditSend->toPlainText().toStdString().c_str();client->write(sendData);setInsertColor(Qt::red,"客户端:" + sendData);
}void Widget::on_pushButtonOut_clicked()
{client->close();ui->textEditRev->append("断开连接\n");ui->pushButtonConnect->setEnabled(true);ui->lineEditIp->setEnabled(true);ui->lineEditPort->setEnabled(true);ui->pushButtonOut->setEnabled(false);ui->btnSend->setEnabled(false);
}void Widget::onConnected()
{timer->stop();this->setEnabled(true);ui->textEditRev->insertPlainText("连接成功\n");ui->pushButtonConnect->setEnabled(false);ui->lineEditIp->setEnabled(false);ui->lineEditPort->setEnabled(false);ui->pushButtonOut->setEnabled(true);ui->btnSend->setEnabled(true);
}void Widget::onError(QAbstractSocket::SocketError error)
{this->setEnabled(true);on_pushButtonOut_clicked();
}void Widget::onTimerOut()
{ui->textEditRev->insertPlainText("连接超时!");client->abort(); //放弃当前连接this->setEnabled(true);}void Widget::setInsertColor(Qt::GlobalColor color, QString str)
{QTextCursor cursor = ui->textEditRev->textCursor();QTextCharFormat format;QBrush brush(color);format.setForeground(brush);cursor.setCharFormat(format);cursor.insertText(str+'\n');ui->textEditRev->moveCursor(QTextCursor::End);  //将光标移动至尾部ui->textEditRev->ensureCursorVisible(); //确定光标可见
}

链接:https://pan.baidu.com/s/1uI_bhvufjcuW1R6CrR9P7g
提取码:3urt
–来自百度网盘超级会员V5的分享

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

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

相关文章

Linux学习笔记————C 语言版 LED 灯实验

这里写目录标题 一、实验程序编写二、 汇编部分实验程序编写三、C 语言部分实验程序编写四、编译下载验证 汇编 LED 灯实验中&#xff0c;我们讲解了如何使用汇编来编写 LED 灯驱动&#xff0c;实际工作中是很少用到汇编去写嵌入式驱动的&#xff0c;毕竟汇编太难&#xff0c;而…

股票价格预测 | Python使用BP神经网络和LSTM神经网络预测股票价格

文章目录 效果一览文章概述代码设计BP神经网络LSTM神经网络效果一览 文章概述 BP神经网络使用

css实现更改checkbox的样式;更改checkbox选中后的背景色;更改checkbox选中后的icon

<input class"check-input" type"checkbox"> .check-input {width: 16px;height: 16px;} /* 设置默认的checkbox样式 */input.check-input[type"checkbox"] {-webkit-appearance: none; /* 移除默认样式 */border: 1px solid #999;outl…

【图像分割】nnUnetV1与V2的Linux部署与应用命令

以前觉得麻烦&#xff0c;一直没用过nnunet&#xff0c;虽然知道它很火&#xff0c;最近一个契机&#xff0c;部署使用了一下nnunet&#xff0c;记录一下其部署和使用的方法与命令。 1、部署 首先&#xff0c;我有一个环境&#xff0c;这个环境可以是以前就有的&#xff0c;也可…

Python | Leetcode Python题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; INT_MAX 2 ** 31 - 1 INT_MIN -2 ** 31class Automaton:def __init__(self):self.state startself.sign 1self.ans 0self.table {start: [start, signed, in_number, end],signed: [end, end, in_number, end],in_number: [end, end,…

LabVIEW齿轮箱噪声监测系统

LabVIEW齿轮箱噪声监测系统 齿轮箱作为机械设备的“心脏”&#xff0c;其健康状态对设备的性能有着重要的影响。传统的齿轮箱监测方法依赖于直接的振动信号分析&#xff0c;但这种方法不仅成本高昂&#xff0c;而且在安装和拆卸过程中可能对设备造成损害。针对这些问题&#x…

Aurora8b10b(2)上板验证

文章目录 前言一、AXI_Stream数据产生模块二、上板效果总结 前言 上一篇内容我们已经详细介绍了基于aurora8b10b IP核的设计&#xff0c;本文将基于此进一步完善并且进行上板验证。 设计思路及代码思路参考FPGA奇哥系列网课 一、AXI_Stream数据产生模块 AXIS协议是非常简单的…

Java零基础入门到精通_Day 4

方法的重载 就是同一个类中的相同方法名的多个方法&#xff0c;但是他们的参数不同&#xff0c;类型不同或者参数个数不同。 &#xff08;与返回值无关&#xff09; package Base_One;public class Base_005 {public static void main(String[] args) {// Main method logic …

C++读取.bin二进制文件

C读取.bin二进制文件 在C中&#xff0c;可以使用文件输入/输出流来进行二进制文件的读写操作&#xff0c;方便数据的保存和读写。 //C读取bin二进制文件 int read_bin() {std::ifstream file("data_100.bin", std::ios::in | std::ios::binary);if (file) {// 按照…

plumelog日志查询使用指南

一、日志查询 字段说明 内容语法 1.中文需要用双引号包含 例如:"异常",默认会被按照单字体分割检索 2.多个检索条件可以用 AND OR NOT 来组合查询 例如 "异常" AND "内容" 3.单个不可分割单词可以用*开头或者结尾进行模糊匹配 例如 *NullPoi…

2013年认证杯SPSSPRO杯数学建模C题(第二阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现&#xff1a; 交通运输作为国民经济的载体&#xff0c;沟通生产和消费&#xff0c;在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系&#xff0c;生产水平越高…