QT 实现仿制 网络调试器(未实现连接唯一性) QT5.12.3环境 C++实现

网络调试助手:


提前准备:在编写代码前,要在.pro工程文件中,添加network模块。


服务端:

代码:

widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QtWidgets>
#include <QTcpServer> // 监听套接字
#include <QTcpSocket> // 通讯套接字
namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();private slots:void on_start_button_clicked(); // 启动按钮slotvoid new_connection_slot(); // 连接slotvoid ready_read_slot(); // 可读slotvoid on_send_button_clicked(); // 发送按钮slotprivate:Ui::Widget *ui;QTcpServer *tcp_server; // 服务端QTcpSocket *tcp_socket; // socket
};#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);this->setWindowTitle("网络调试器服务端"); // 标题// 实例化监听套接字tcp_server = new QTcpServer(this);tcp_socket = nullptr;connect(tcp_server,&QTcpServer::newConnection,this,&Widget::new_connection_slot);
}Widget::~Widget()
{delete ui;
}void Widget::on_start_button_clicked()
{// 监听( bind() + listen() )if(ui->start_button->text() == "启动"){QString ip = ui->ip_edit->text(); // 读取ipQString port = ui->port_edit->text(); // 读取portif(!tcp_server->listen(QHostAddress(ip),port.toUShort())){ui->plainTextEdit->setPlainText("服务端启动失败....");}else{ui->plainTextEdit->setPlainText("服务端启动成功....");ui->start_button->setText("断开"); // 改变按钮文本}}else if(ui->start_button->text() == "断开"){tcp_server->close(); // 关闭ui->plainTextEdit->appendPlainText("服务器断开成功....");ui->start_button->setText("启动"); // 改变按钮文本}
}void Widget::new_connection_slot()
{tcp_socket = tcp_server->nextPendingConnection();QString client_ip = tcp_socket->peerAddress().toString(); // 获取客户端ip(转换成QString)quint16 client_port = tcp_socket->peerPort();ui->plainTextEdit->appendPlainText(QString("客户端 IP: %1  PORT:%2 连接成功").arg(client_ip).arg(client_port));connect(tcp_socket,&QTcpSocket::readyRead,this,&Widget::ready_read_slot);
}void Widget::ready_read_slot()
{QByteArray buf = tcp_socket->readAll(); // 读数据QString s = QString::fromLocal8Bit(buf); // 编码转换ui->plainTextEdit->appendPlainText(QString("服务端发来数据:%1").arg(QString(s))); // 显示
}void Widget::on_send_button_clicked()
{QString buf = ui->send_edit->text(); // 读数据tcp_socket->write(buf.toLocal8Bit()); // 发送数据ui->plainTextEdit->appendPlainText(QString("服务端发送数据:%1").arg(buf)); // 显示}
widget.ui


输出:


客户端:

代码:

widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>
namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();private slots:void on_start_button_clicked(); // 连接按钮slotvoid ready_read_slot(); // 可读slotvoid on_send_button_clicked(); // 发送按钮slotprivate:Ui::Widget *ui;QTcpSocket *tcp_sock; // socket
};#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);tcp_sock = new QTcpSocket(this);this->setWindowTitle("网络调试器客户端"); // 标题connect(tcp_sock,&QTcpSocket::readyRead,this,&Widget::ready_read_slot);
}Widget::~Widget()
{delete ui;
}void Widget::on_start_button_clicked()
{QString ip = ui->ip_edit->text(); // 获取ipQString port = ui->port_edit->text(); // 获取portif(ui->start_button->text() == "连接"){tcp_sock->connectToHost(ip,port.toUShort()); // 连接if(tcp_sock->waitForConnected()){ui->plainTextEdit->setPlainText("连接服务器成功...");ui->start_button->setText("断开"); // 改变按钮文本}else{ui->plainTextEdit->setPlainText("连接服务器失败...");}}else if(ui->start_button->text() == "断开"){tcp_sock->close(); // 关闭ui->plainTextEdit->appendPlainText("客户端断开成功....");ui->start_button->setText("连接"); // 改变按钮文本}
}void Widget::ready_read_slot(){QByteArray buf = tcp_sock->readAll(); // 读数据QString data = QString::fromLocal8Bit(buf); // 编码转换ui->plainTextEdit->appendPlainText(QString("服务端发来数据 %1").arg(data));
}void Widget::on_send_button_clicked()
{QString buf = ui->send_edit->text(); // 获取数据tcp_sock->write(buf.toLocal8Bit()); // 编码转换ui->plainTextEdit->appendPlainText(QString("服务端发送数据 %1").arg(buf));
}
widget.ui


输出:


测试:

同时打开服务端和客户端

启动服务端并连接客户端

发送文本测试

断开连接

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

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

相关文章

Vscode写markdown快速插入python代码

如图当我按下快捷键CRTLSHIFTK 自动出现python代码片段 配置方法shortcuts’ 打开这个json文件 输入 {"key": "ctrlshiftk","command": "editor.action.insertSnippet","when": "editorTextFocus","args&…

【案例】泛微.齐业成助力北京中远大昌汽车实现数电票全流程管理

中远大昌统一发票共享平台上线三个多月以来&#xff0c;实现&#xff1a; 5000份 60000元 发票开具 成本节约 客户简介及需求分析 北京中远大昌汽车服务有限公司&#xff08;以下简称“中远大昌”&#xff09;成立于2002年&#xff0c;是中远海运集团所属香远&#xff08;北…

使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像

文章目录 应用快速部署NginxRedisMySQLTomcat 制作镜像镜像原理基于已有容器创建使用 Dockerfile 创建镜像指令说明构建应用创建 Dockerfile 文件创建镜像 应用快速部署 Nginx docker run -d -p 80:80 nginx使用浏览器访问虚拟机地址 Redis docker pull redis docker run --…

雅思阅读TFNG题型7大解题思路

雅思阅读TFNG题型7大解题思路&#xff0c;全在这了‼️ ⚠️在徘徊在6-6.5的同学有很大的共性就是对题型不够熟悉&#xff0c;我记得我当时卡6.5的时候我有时候分不清NG和F&#xff0c;有时候又分不清NG 和True&#xff0c;也不知道他有哪几种考我的方法&#xff0c;脑子里没有…

家政服务系统开发,智慧家政,便捷生活

近年来&#xff0c;大众对家政服务的需求不断增加&#xff0c;家政服务种类也逐渐多样化&#xff0c;涵盖了日常生活中的各个方面&#xff0c;为大众带来更急优质的服务&#xff0c;进一步提升了家政市场的发展。 在数字化发展的推动下&#xff0c;互联网家政服务的模式应运而…

重生之我在学环境变量

环境变量 基本概念 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但 是照样可以链接成功&#…

Java基础夯实——2.7 线程上下文切换

线程上下文切换&#xff08;Thread Context Switching&#xff09;是操作系统在多线程环境中&#xff0c;切换CPU从执行一个线程的上下文到另一个线程的上下文的过程。这种切换是实现多线程并发执行的核心机制之一。 1 上下文: 线程的上下文指线程在某一时刻的执行状态,如&am…

AI模型简介

深度学习模型种类繁多&#xff0c;可以根据任务类型和应用场景进行分类。以下是主要模型类型的详细介绍&#xff0c;每种模型包含了其特点、功能、代表性模型&#xff0c;以及常见应用。 1. 分类模型 分类模型是深度学习中最基本也是最广泛应用的模型类型&#xff0c;其目标是…

Failed to start Docker Application Container Engine

说明&#xff1a; 1&#xff09;访问应用业务&#xff0c;读取不到数据&#xff0c;show databases;查看数据库报错 2&#xff09;重启docker服务&#xff0c;服务启动失败&#xff0c;查看日志报错如下图所示 3&#xff09;报错信息&#xff1a;chmod /data/docker: read-only…

SQL 语句执行计划中的连接方式

SQL 语句执行计划中的连接方式 join操作 join操作基本分为3大类&#xff1a;外连接&#xff08;细分为&#xff1a;左连接&#xff08;Left outer join/ left join&#xff09;、右连接&#xff08;right outer join/ right join&#xff09;、全连接&#xff08;full outer …

如何理解Lua 使用虚拟堆栈

虚拟堆栈的基本概念 Lua使用虚拟堆栈来实现Lua和C&#xff08;或其他宿主语言&#xff09;之间的交互。这个虚拟堆栈是一个数据结构&#xff0c;用于存储Lua的值&#xff0c;如数字、字符串、表、函数等。它在Lua状态机&#xff08;lua_State&#xff09;内部维护&#xff0c;为…

FileProvider高版本使用,跨进程传输文件

高版本的android对文件权限的管控抓的很严格,理论上两个应用之间的文件传递现在都应该是用FileProvider去实现,这篇博客来一起了解下它的实现原理。 首先我们要明确一点,FileProvider就是一个ContentProvider,所以需要在AndroidManifest.xml里面对它进行声明: <provideran…

【大数据知识】ClickHouse入门

ClickHouse入门 概述一、主要应用场景二、技术特点三、性能表现四、限制与不足五、使用建议 分布式架构一、架构特点二、核心组件三、数据组织方式四、分布式查询原理五、优势与局限性 核心架构一、ClickHouse执行过程架构二、ClickHouse数据存储架构 为什么速度这么快存储层&a…

C# .Net Core通过StreamLoad向Doris写入CSV数据

以下代码可以只关注StreamLoad具体实现。 1.创建StreamLoad返回值Model public class StreamLoadResponse {public long TxnId { get; set; }public string Label { get; set; }public string Comment { get; set; }public string TwoPhaseCommit { get; set; }public string…

golang 嵌入式armv7l压缩编译打包

编译 Go 应用程序 go build -ldflags"-s -w" -o myapp.exe . 使用 UPX 压缩可执行文件&#xff08;window下载并设置环境变量&#xff09; upx --best --lzma myapp.exe 可从10M压缩到1M 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 …

45.坑王驾到第九期:Mac安装typescript后tsc命令无效的问题

点赞收藏加关注&#xff0c;你也能主打别墅&#xff01; 一、问题描述 Mac上终端运行如下命令&#xff1a; sudo npm install typescript -g //全局安装ts提示成功安装后&#xff0c;我测试tsc -v这个命令时出现如下错误&#xff1a; 也就是说找不到 tsc 命令。 二、解决方…

CircuitBreaker机制详解:Elasticsearch中的资源管理

CircuitBreaker机制详解:Elasticsearch中的资源管理 在现代软件架构中,熔断器(CircuitBreaker)是一种重要的模式,用于防止系统过载并保护系统稳定性。在Elasticsearch中,熔断器机制尤其关键,因为它们帮助管理资源使用,防止节点因资源耗尽而崩溃。本文将深入探讨Elasti…

测试岗位应该学什么

以下是测试岗位需要学习的一些关键内容&#xff1a; 1. 测试理论和方法 - 了解不同类型的测试&#xff0c;如功能测试、性能测试、压力测试、安全测试、兼容性测试等。 - 掌握测试策略和测试计划的制定。 2. 编程语言 - 至少熟悉一种编程语言&#xff0c;如 Python、Java…

【图像检测】深度学习与传统算法的区别(识别逻辑、学习能力、泛化能力)

识别逻辑 深度学习 使用了端到端的学习策略&#xff0c;直接学习从图像到检测结果的映射关系&#xff0c;自动提取特征&#xff0c;并且根据特征与特征之间的关系&#xff0c;计算出检测结果。 传统算法 则是人工提取特征&#xff0c;比如边缘特征&#xff0c;直线特征&#x…

sysbench压测DM的高可用切换测试

一、配置集群 1. 配置svc.conf [rootlocalhost dm]# cat /etc/dm_svc.conf TIME_ZONE(480) LANGUAGE(CN)DM(192.168.112.139:5236,192.168.112.140:5236) [DM] LOGIN_MODE(1) SWITCH_TIME(300) SWITCH_INTERVAL(200)二、编译sysbench 2.1 配置环境变量 [dmdba~]# vi ~/.bas…