Qt网络编程-写一个简单的网络调试助手

环境

Windows:Qt5.15.2(VS2022)

Linux:Qt5.12.12(gcc)

源代码

TCP服务器

头文件:

#ifndef TCPSERVERWIDGET_H
#define TCPSERVERWIDGET_H
#include <QWidget>
namespace Ui {
class TCPServerWidget;
}
class QTcpServer;
class QTcpSocket;
class TCPServerWidget : public QWidget {Q_OBJECT
public:explicit TCPServerWidget(QWidget *parent = nullptr);~TCPServerWidget();private:QTcpSocket *socket(int row);
private slots:void on_listen_clicked();void on_close_clicked();void on_send_clicked();void on_clear_clicked();private:Ui::TCPServerWidget *ui;QTcpServer *m_Server;QList<QTcpSocket *> m_Clients;
};
#endif // TCPSERVERWIDGET_H

源文件:

#include "tcpserverwidget.h"
#include "common.h"
#include "ui_tcpserverwidget.h"
#include <QHeaderView>
#include <QTcpServer>
#include <QTcpSocket>
TCPServerWidget::TCPServerWidget(QWidget *parent): QWidget(parent), ui(new Ui::TCPServerWidget) {ui->setupUi(this);ui->localIp->addItem("Any");ui->localIp->addItems(getIPAddresses());ui->clientTable->setEditTriggers(QAbstractItemView::NoEditTriggers);ui->clientTable->setSelectionBehavior(QAbstractItemView::SelectRows);ui->clientTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);m_Server = new QTcpServer;connect(m_Server, &QTcpServer::newConnection, [=]() {QTcpSocket *tcpSocket = m_Server->nextPendingConnection();QString ip = tcpSocket->peerAddress().toString();quint16 port = tcpSocket->peerPort();appendLog(ui->textEdit, QString("%1:%2:connect").arg(ip).arg(port));bool r = false;for (int i = 0; i < ui->clientTable->rowCount(); ++i) {QTableWidgetItem *ipitem = ui->clientTable->item(i, 0);QTableWidgetItem *portitem = ui->clientTable->item(i, 1);if (nullptr != ipitem && nullptr != portitem &&ipitem->text() == ip && portitem->text().toUShort() == port) {r = true;break;}}connect(tcpSocket, &QTcpSocket::disconnected, [=]() {appendLog(ui->textEdit,QString("%1:%2 disconnected").arg(tcpSocket->peerAddress().toString()).arg(tcpSocket->peerPort()));for (int i = 0; i < ui->clientTable->rowCount(); ++i) {QTableWidgetItem *ipitem = ui->clientTable->item(i, 0);QTableWidgetItem *portitem = ui->clientTable->item(i, 1);if (nullptr != ipitem && nullptr != portitem &&ipitem->text() == ip &&portitem->text().toUShort() == port) {ui->clientTable->removeRow(i);break;}}for (QTcpSocket *socket : m_Clients) {if (ip == socket->peerAddress().toString() &&port == socket->peerPort()) {m_Clients.removeOne(socket);socket = nullptr;break;}}});connect(tcpSocket, &QTcpSocket::readyRead, [=]() {QByteArray data = (ui->toHex->isChecked())? tcpSocket->readAll().toHex(): tcpSocket->readAll();appendLog(ui->textEdit,QString("%1:%2:%3").arg(ip).arg(port).arg(QString(data)));});m_Clients.append(tcpSocket);int row = ui->clientTable->rowCount();ui->clientTable->insertRow(row);ui->clientTable->setItem(row, 0, new QTableWidgetItem(ip));ui->clientTable->setItem(row, 1,new QTableWidgetItem(QString::number(port)));});
}TCPServerWidget::~TCPServerWidget() {delete ui;
}QTcpSocket *TCPServerWidget::socket(int row) {QTableWidgetItem *ipitem = ui->clientTable->item(row, 0);QTableWidgetItem *portitem = ui->clientTable->item(row, 1);if (nullptr != ipitem && nullptr != portitem) {QString ip = ipitem->text();quint16 port = portitem->text().toUShort();for (QTcpSocket *tcpSocket : m_Clients) {if (ip == tcpSocket->peerAddress().toString() &&port == tcpSocket->peerPort())return tcpSocket;}}return nullptr;
}void TCPServerWidget::on_listen_clicked() {if (ui->listen->text() == "listen") {if (m_Server->listen((ui->localIp->currentText() == "Any")? QHostAddress::Any: QHostAddress(ui->localIp->currentText()),ui->localPort->value())) {ui->listen->setText("listening");appendLog(ui->textEdit, "start listening");} else {appendLog(ui->textEdit,"start listen error:" + m_Server->errorString());}} else {m_Server->close();ui->listen->setText("listen");for (QTcpSocket *tcpSocket : m_Clients) {tcpSocket->close();tcpSocket->disconnectFromHost();}m_Clients.clear();appendLog(ui->textEdit, "stop listening");}
}void TCPServerWidget::on_close_clicked() {int row = ui->clientTable->currentRow();QTcpSocket *tcpSocket = socket(row);if (nullptr != tcpSocket) {tcpSocket->close();tcpSocket->disconnectFromHost();}
}void TCPServerWidget::on_send_clicked() {QByteArray data = (ui->toHex->isChecked())? QByteArray::fromHex(ui->message->text().toUtf8()): ui->message->text().toUtf8();int row = ui->clientTable->currentRow();QTcpSocket *tcpSocket = socket(row);if (nullptr != tcpSocket)tcpSocket->write(data, data.size());
}void TCPServerWidget::on_clear_clicked() {ui->textEdit->clear();
}

TCP客户端

头文件:

#ifndef TCPCLIENTWIDGET_H
#define TCPCLIENTWIDGET_H#include <QWidget>namespace Ui {
class TCPClientWidget;
}class QTcpSocket;
class TCPClientWidget : public QWidget {Q_OBJECTpublic:explicit TCPClientWidget(QWidget *parent = nullptr);~TCPClientWidget();private slots:void on_connect_clicked();void on_send_clicked();void on_clear_clicked();private:Ui::TCPClientWidget *ui;QTcpSocket *m_Socket;
};#endif // TCPCLIENTWIDGET_H

源文件:

#include "tcpclientwidget.h"
#include "common.h"
#include "ui_tcpclientwidget.h"
#include <QFutureWatcher>
#include <QTcpSocket>
#include <QtConcurrent/QtConcurrent>TCPClientWidget::TCPClientWidget(QWidget *parent): QWidget(parent), ui(new Ui::TCPClientWidget) {ui->setupUi(this);ui->localIp->addItems(getIPAddresses());m_Socket = new QTcpSocket;connect(m_Socket, &QTcpSocket::disconnected, [=]() {ui->connect->setText("connect");appendLog(ui->textEdit, "disconnect");});connect(m_Socket, &QTcpSocket::readyRead, [=]() {QByteArray data = (ui->toHex->isChecked()) ? m_Socket->readAll().toHex(): m_Socket->readAll();appendLog(ui->textEdit, QString(data));});
}TCPClientWidget::~TCPClientWidget() {delete ui;
}void TCPClientWidget::on_connect_clicked() {if ("connect" == ui->connect->text()) {if (ui->bind->isChecked()) {if (!m_Socket->bind(QHostAddress(ui->localIp->currentText()),ui->localPort->value())) {appendLog(ui->textEdit,"bind error:" + m_Socket->errorString());return;}}ui->connect->setEnabled(false);m_Socket->connectToHost(QHostAddress(ui->serverIp->text()),ui->serverPort->value());if (m_Socket->waitForConnected()) {ui->connect->setText("disconnect");appendLog(ui->textEdit, "connect");} elseappendLog(ui->textEdit, "connect error:" + m_Socket->errorString());ui->connect->setEnabled(true);} else {m_Socket->close();m_Socket->disconnectFromHost();ui->connect->setText("connect");appendLog(ui->textEdit, "disconnect");}
}void TCPClientWidget::on_send_clicked() {QByteArray data = (ui->toHex->isChecked())? QByteArray::fromHex(ui->message->text().toUtf8()): ui->message->text().toUtf8();if (m_Socket->isOpen()) m_Socket->write(data, data.size());
}void TCPClientWidget::on_clear_clicked() {ui->textEdit->clear();
}

UDP

头文件:

#ifndef UDPWIDGET_H
#define UDPWIDGET_H#include <QWidget>namespace Ui {
class UDPWidget;
}class QUdpSocket;
class UDPWidget : public QWidget {Q_OBJECTpublic:explicit UDPWidget(QWidget *parent = nullptr);~UDPWidget();private slots:void on_bind_clicked();void on_send_2_clicked();void on_clear_2_clicked();private:Ui::UDPWidget *ui;QUdpSocket *m_Socket;
};#endif  // UDPWIDGET_H

源文件:

#include "udpwidget.h"
#include <QUdpSocket>
#include "common.h"
#include "ui_udpwidget.h"UDPWidget::UDPWidget(QWidget *parent) : QWidget(parent), ui(new Ui::UDPWidget) {ui->setupUi(this);ui->localIp_2->addItems(getIPAddresses());m_Socket = new QUdpSocket;connect(m_Socket, &QUdpSocket::readyRead, [=]() {while (m_Socket->hasPendingDatagrams()) {QByteArray data;QHostAddress host;quint16 port;data.resize(m_Socket->pendingDatagramSize());m_Socket->readDatagram(data.data(), data.size(), &host, &port);data = (ui->toHex_2->isChecked()) ? data.toHex() : data;appendLog(ui->textEdit, QString("%1:%2:%3").arg(host.toString()).arg(port).arg(QString(data)));}});
}UDPWidget::~UDPWidget() { delete ui; }void UDPWidget::on_bind_clicked() {if (ui->bind->text() == "bind") {if (m_Socket->bind(QHostAddress(ui->localIp_2->currentText()),ui->localPort_2->value()))ui->bind->setText("unbind");elseappendLog(ui->textEdit, "bind error:" + m_Socket->errorString());} else {m_Socket->abort();ui->bind->setText("bind");}
}void UDPWidget::on_send_2_clicked() {QByteArray data = (ui->toHex_2->isChecked())? QByteArray::fromHex(ui->message_2->text().toUtf8()): ui->message_2->text().toUtf8();m_Socket->writeDatagram(data, QHostAddress(ui->serverIp->text()),ui->serverPort->value());
}void UDPWidget::on_clear_2_clicked() { ui->textEdit->clear(); }

运行效果

TCP服务器与多个客户端通信:

UDP之间通信:

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

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

相关文章

Linux文本三剑客(2)

文章目录 一、Linux文本三剑客之awk使用方法awk 的原理实例一&#xff1a;只查看test.txt文件&#xff08;100行&#xff09;内第20到第30行的内容&#xff08;企业面试&#xff09;实例二&#xff1a;已知test.txt文件内容为 BEGIN 和 END 模块实例一&#xff1a;统计/etc/pas…

C#实现矩阵乘法

目录 一、使用的方法 1.矩阵 2.矩阵的乘法原理 二、实例 1.源码 2.生成效果 一、使用的方法 矩阵相当于一个数组&#xff0c;主要用来存储一系列数&#xff0c;例如&#xff0c;mn矩阵是排列在m行和n列中的一系列数&#xff0c;mn矩阵可与一个np矩阵相乘&#xff0c;结果…

AAAI 2024 | Adobe提出全新上下文提示学习框架CoPL,高效提升下游性能

论文题目&#xff1a;CoPL: Contextual Prompt Learning for Vision-Language Understanding 论文链接&#xff1a;https://arxiv.org/abs/2307.00910 提示学习&#xff08;Prompt Learning&#xff09;在近几年的快速发展&#xff0c;激活了以Transformer为基础的大型语言模型…

备战蓝桥杯---搜索(进阶2)

话不多说&#xff0c;直接看题&#xff1a; 相当于找一个点使它到3个国家的距离和min,显然&#xff0c;我们不可以枚举点&#xff0c;但是&#xff0c;我们可以对这3个国家分别bfs&#xff0c;然后枚举相加即可。 下面是AC代码&#xff1a; #include<bits/stdc.h> usin…

ChatGpt报错:Your authentication token is no longer valid解决办法

今天打开ChatGpt突然提示Oops&#xff01;,Your authentication token is no longer valid.&#xff0c;之前还好好的&#xff0c;环境也没变啊&#xff0c;结果弄了好久终于解决&#xff0c;于是记录一下解决过程&#xff0c;顺便总结一下关于OpenAI各种报错的解决办法。 完整…

图书系统的Web实现(含源码)

源码地址https://gitee.com/an-indestructible-blade/project 注意事项&#xff1a; BorrowBooksWeb\src\main\resources路径下的application.yml文件里面的url&#xff0c;username&#xff0c;password这三个属性和自己的数据库保持一致。 浏览器访问url:http://127.0.0.1:…

centos中docker操作

一、安装docker 确保系统是CentOS 7并且内核版本高于3.10,可以通过uname -r命令查看内核版本。 更新系统软件包到最新版本,可以使用命令yum update -y。 安装必要的软件包,包括yum-utils、device-mapper-persistent-data和lvm2。使用命令yum install -y yum-utils devic…

2024年【高压电工】考试题库及高压电工考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年高压电工考试题库为正在备考高压电工操作证的学员准备的理论考试专题&#xff0c;每个月更新的高压电工考试内容祝您顺利通过高压电工考试。 1、【单选题】 ()是指不会使人发生触电危险的电压。&#xff08; C…

【JAVA WEB】 css背景属性 圆角矩形的绘制

目录 背景属性设置 圆角矩形 背景属性设置 背景颜色,在style中 background-color:颜色&#xff1b; 背景图片 background-image:url(……) 背景图片的平铺方式 background-repeat: 平铺方式 repeat 平铺&#xff08;默认&#xff09;no-repeat 不平铺repeat-x 水平平铺repea…

RK3588平台开发系列讲解(AI 篇)什么是NPU

文章目录 一、什么是NPU二、什么是RKNPU沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解什么是NPU。 一、什么是NPU 📢什么是 NPU 呢? 在谈这个问题之前,可以先来看看什么是 CPU 和 GPU,CPU 就是中央处理器,中央处理器就好像是人类的大脑,主要负…

股票均线的使用方法和实战技术,看涨看空的均线形态与案例教学

一、教程描述 本套教程讲解了14种均线的特殊形态&#xff0c;通过直观图形以及大量案例的教学&#xff0c;将深奥、繁琐的均线变得生动与具体&#xff0c;广大投资者在认真学习以后&#xff0c;可以学会均线的使用方法&#xff0c;掌握最强的均线应用实战技术。本套教程不仅适…

大数据可视化/算法推荐/情感分析——基于Django电影评论数据可视化分析推荐系统(完整系统源码+数据库+详细文档+论文+部署教程)

文章目录 大数据可视化/算法推荐/情感分析——基于Django电影评论数据情感分析可视化分析推荐系统源码资料获取方式在文章末尾 一、 选题背景二、研究目的三、开发技术介绍1、Django框架2、LDA3、机器学习推荐算法4、大数据爬虫5、大数据Echarts可视化 四、系统设计思想五、部分…