Qt中的网络编程(Tcp和Udp)详解 及 实现

Qt中的网络编程(Tcp和Udp)详解 及 实现
代码 卡的格式不对,看我的代码标题去 拷贝 ,共四个文件。

1、安装qty软件,官网直接下载 在线安装。 怕以后麻烦直接安装选择一个完整版本QT勾选。 在线下载i30多g应该,官网默认下载半天最少了。可以给参数 来源于国内源,在线就快到半小时搞定
2、qt 信号和槽机制 自动:双击 按钮 啥的UI控件 ,然后就会自动添加 槽函数原型,自己写要显示的东西就行
如果信号和槽机制 手动:用Qt connect。 格式:connect(&sender,&CLASSA::signal,&receiver ,&CLASSB:: slot, Qt::连接方式);
3、 Qt TCP网络上位机的设计

分为客户端和服务端端,要 分别打开一个QT建设项目:
新建工程-都选择 QWidget 程序-qmake-默认-完成。

两个pro:添加 QT += network,引入模块。
分别 在 mainwindow.ui 中画图,根据窗口的按钮、文本框等元素去画图。 并修改UI元素的

4、分别修改两个工程的 两个文件
mainwindow.h
mainwindow.cpp
内容直接拷贝:
客户端:mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include

#include
#include
#include

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;

private:
QTcpSocket *tcpclient; // 客户端tcpclient
QString getlocalip(); // 获取本机IP地址

protected:
void closeEvent(QCloseEvent *event);

private slots:
void connectfunc();
void disconnectfunc();
void socketreaddata();

void on_pushButton_Connect_clicked();
void on_pushButton_Send_clicked();
void on_pushButton_Disconnect_clicked();

};
#endif // MAINWINDOW_H
客户端:mainwindow.cpp
#include “mainwindow.h”
#include “ui_mainwindow.h”

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
tcpclient=new QTcpSocket(this);QString strip=getlocalip();ui->comboBoxIp->addItem(strip);connect(tcpclient,SIGNAL(connected()),this,SLOT(connectfunc()));
connect(tcpclient,SIGNAL(disconnected()),this,SLOT(disconnectfunc()));
connect(tcpclient,SIGNAL(readyRead()),this,SLOT(socketreaddata()));

}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::on_pushButton_Connect_clicked()
{
QString addr=ui->comboBoxIp->currentText();
quint16 port=ui->spinBoxPort->value();
tcpclient->connectToHost(addr,port);
}

void MainWindow::on_pushButton_Send_clicked()
{
QString strmsg=ui->lineEdit_InputMsg->toPlainText();
ui->plainTextEdit_DispMsg->setPlainText(“[out]:”+strmsg);
ui->lineEdit_InputMsg->clear();

QByteArray str=strmsg.toUtf8();
str.append('\n');
tcpclient->write(str);

}

void MainWindow::on_pushButton_Disconnect_clicked()
{
if(tcpclient->state()==QAbstractSocket::ConnectedState)
tcpclient->disconnectFromHost();
}

QString MainWindow::getlocalip() // 获取本机IP地址
{
QString hostname=QHostInfo::localHostName();
QHostInfo hostinfo=QHostInfo::fromName(hostname);

QString localip="";QList<QHostAddress> addlist=hostinfo.addresses();
if(!addlist.isEmpty())
{for (int i=0;i<addlist.count();i++){QHostAddress ahost=addlist.at(i);if(QAbstractSocket::IPv4Protocol==ahost.protocol()){localip=ahost.toString();break;}}
}return localip;

}

void MainWindow::closeEvent(QCloseEvent *event)
{
if(tcpclient->state()==QAbstractSocket::ConnectedState)
{
tcpclient->disconnectFromHost();
}
// event->accept();

}

void MainWindow::connectfunc()
{
ui->plainTextEdit_DispMsg->setPlainText(“已经连接到服务器端”);
ui->plainTextEdit_DispMsg->setPlainText(“**********peer address:”+
tcpclient->peerAddress().toString());
ui->plainTextEdit_DispMsg->setPlainText(“**********peer port:”+
QString::number(tcpclient->peerPort()));

ui->pushButton_Connect->setEnabled(false);
ui->pushButton_Disconnect->setEnabled(true);

}
void MainWindow::disconnectfunc()
{
ui->plainTextEdit_DispMsg->setPlainText(“已断开与服务器端的连接”);

ui->pushButton_Connect->setEnabled(true);
ui->pushButton_Disconnect->setEnabled(false);

}
void MainWindow::socketreaddata()
{
while(tcpclient->canReadLine())
ui->plainTextEdit_DispMsg->setPlainText(“[in]:”+tcpclient->readLine());

}

服务器端:mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include

#include // 专门用于建立TCP连接并传输数据信息
#include // 此模块提供开发TCP/IP客户端和服务器的类

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui;

// 自定义如下

private:
QTcpServer *tcpserver; //TCP服务器
QTcpSocket *tcpsocket;// TCP通讯socket
QString GetLocalIpAddress(); // 获取本机的IP地址

private slots:
void clientconnect();
void clientdisconnect();
void socketreaddata();
void newconnection();

void on_pushButton_Start_clicked();
void on_pushButton_Stop_clicked();
void on_pushButton_Send_clicked();

protected:
void closeEvent(QCloseEvent *event);

};
#endif // MAINWINDOW_H
服务器端:mainwindow.cpp
#include “mainwindow.h”
#include “ui_mainwindow.h”
#include
#include

MainWindow::MainWindow(QWidget *parent)
QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString strip=GetLocalIpAddress();
// QMessageBox::information(this,"数据",strip,QMessageBox::Yes);ui->comboBoxIp->addItem(strip);tcpserver=new QTcpServer(this);connect(tcpserver,SIGNAL(newConnection()),this,SLOT(newconnection()));

}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::on_pushButton_Start_clicked()
{
QString ip=ui->comboBoxIp->currentText();
quint16 port=ui->spinBoxPort->value();

QHostAddress address(ip);
tcpserver->listen(address,port);ui->plainTextEdit_DispMsg->setPlainText("$$$$$$$$$$开始监听$$$$$$$$$$");
ui->plainTextEdit_DispMsg->setPlainText("$$$$$$$$$$服务器地址$$$$$$$$$$:"+tcpserver->serverAddress().toString());
ui->plainTextEdit_DispMsg->setPlainText("$$$$$$$$$$服务器端口$$$$$$$$$$:"+QString::number(tcpserver->serverPort()));
ui->pushButton_Start->setEnabled(false);
ui->pushButton_Stop->setEnabled(true);

}

void MainWindow::on_pushButton_Stop_clicked()
{
if(tcpserver->isListening())
{
tcpserver->close();
ui->pushButton_Start->setEnabled(true);
ui->pushButton_Stop->setEnabled(false);
}

}

void MainWindow::on_pushButton_Send_clicked()
{
QString strmsg=ui->lineEdit_InputMsg->toPlainText();

ui->plainTextEdit_DispMsg->setPlainText("[out]:"+strmsg);ui->lineEdit_InputMsg->clear();QByteArray str=strmsg.toUtf8();
str.append("\n");
tcpsocket->write(str);

}

QString MainWindow::GetLocalIpAddress() // 获取本机的IP地址
{
QString hostname=QHostInfo::localHostName();
QHostInfo hostinfo=QHostInfo::fromName(hostname);

QString localip="";QList<QHostAddress> addresslist=hostinfo.addresses();if(!addresslist.isEmpty())
{for (int i=0;i<addresslist.count();i++){QHostAddress addrhost=addresslist.at(i);if(QAbstractSocket::IPv4Protocol==addrhost.protocol()){localip=addrhost.toString();break;}}
}return localip;

}

void MainWindow::clientconnect()
{
// 客户端连接
ui->plainTextEdit_DispMsg->setPlainText(“客户端socket连接”);
ui->plainTextEdit_DispMsg->setPlainText(“**********peer address:”+
tcpsocket->peerAddress().toString());
ui->plainTextEdit_DispMsg->setPlainText(“**********peer port:”+
QString::number(tcpsocket->peerPort()));

}

void MainWindow::clientdisconnect()
{
// 客户端断开连接
ui->plainTextEdit_DispMsg->setPlainText(“客户端socket断开连接”);
tcpsocket->deleteLater();

}

void MainWindow::socketreaddata()
{
// 读取数据
while(tcpsocket->canReadLine())
ui->plainTextEdit_DispMsg->setPlainText(“[in]”+tcpsocket->readLine());

}

void MainWindow::newconnection()
{
tcpsocket=tcpserver->nextPendingConnection();

connect(tcpsocket,SIGNAL(connected()),this,SLOT(clientconnect()));
clientconnect();connect(tcpsocket,SIGNAL(disconnected()),this,SLOT(clientdisconnect()));connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(socketreaddata()));connect(tcpsocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),this,SLOT(OnSocketStateChanged(QAbstractSocket::SocketState)));

}

void MainWindow::closeEvent(QCloseEvent *event)
{
if(tcpserver->isListening())
tcpserver->close();

// event->accept();

}

5、运行后
服务器和客户端都运行后,给出一样的端口,如11然后启动并连接服务器,就可以相互发送信息了。

6、让你参考 没让你抄人家
我料你也超不了。

抄袭原作者,致敬:https://blog.csdn.net/m0_74712453/article/details/134521569(抄袭的目的在于了解和会,没叫你超过)

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

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

相关文章

Stream浅解析

Stream流浅解析 package com.w.earn.share;import java.util.*; import java.util.stream.Collectors;/*** Author yang kai bo* Date 2024/5/26 19:43* Description* 概念&#xff1a;stream流是一种对 Java 集合运算和表达的高阶抽象。* 优点&#xff1a;写法简单&#xf…

python内置函数map/filter/reduce详解

在Python中&#xff0c;map(), filter(), 和 reduce() 是内置的高级函数(实际是class)&#xff0c;用于处理可迭代对象&#xff08;如列表、元组等&#xff09;的元素。这些函数通常与lambda函数一起使用&#xff0c;以简洁地表达常见的操作。下面我将分别解释这三个函数。 1. …

mac安装git心得

我是买了一个新的mac但是当我安装git的时候遇见了很多问题 安装不上各种报错 首先我们直接打开git网址&#xff0c;然后打开mac的命令提示&#xff0c;里边输入git大概1g左右&#xff0c;下载完了直接好了

持续总结中!2024年面试必问 20 道 Redis面试题(七)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道 Redis面试题&#xff08;六&#xff09;-CSDN博客 十三、Redis集群的主从复制模型是怎样的&#xff1f; Redis集群的主从复制模型是一种高可用性架构&#xff0c;它允许数据在多个节点之间进行复制&#x…

pod 之资源限制 与健康检查

目录 一 资源限制 1&#xff0c;资源限制是什么 2&#xff0c;资源限制的 标准 3&#xff0c; k8s 创pod 显示 OOMKILLED 是 requests小了 还是limits小了 4&#xff0c; Pod 和 容器 的资源请求和限制 &#xff08;yaml&#xff09; 5&#xff0c; CPU 资源单位 6&…

xgboost项目实战-保险赔偿额预测与信用卡评分预测001

目录 算法代码 原理 算法流程 xgb.train中的参数介绍 params min_child_weight gamma 技巧 算法代码 代码获取方式&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1QV7nMC5ds5wSh-M9kuiwew?pwdx48l 提取码&#xff1a;x48l 特征直方图统计&#xff1a; fig, …

这次泰迪杯应该不能答辩

检查了里面还有没修改完的&#xff0c;只能但愿没看到 魔改了又去投水赛&#xff0c;理论加应用

各大模型厂商API使用:百度、阿里、豆包、kimi、deepseek

百度ERNIE(支持requests接口) ERNIE Speed、ERNIE Lite免费 免费测试下来模型ernie_speed输出吞吐量计算20-30来个,“{length/cost} tokens/s” 输出总长度/耗时 https://qianfan.cloud.baidu.com/ 文档: https://cloud.baidu.com/doc/WENXINWORKSHOP/s/dltgsna1o a…

JavaScript-函数的使用

函数的语法 函数就是包裹在花括号里面的代码&#xff0c;当用户需要多次使用 某个代码时&#xff0c;可以用函数包裹住这个代码&#xff0c;然后调用函数即可 比如js自己封装好的函数doucument.write(),console.log()等等 function functionname() {/*代码块*/ } 函数的组成部…

Flink Kylinv10 java8 Flink镜像制作

1&#xff09;基于麒麟v10版本制作JDK8基础镜像在这里插入代码片 FROM kylinv10/kylin:b09 RUN set -ex; \dnf install -y wget java-1.8.0-openjdk java-1.8.0-openjdk-devel tar; \yum clean all RUN java -version CMD ["echo", "kylinv10 JDK 8 image is …

智能进化:深度学习与进化计算的融合艺术

《进化深度学习》这本书深入探索了进化计算&#xff08;EC&#xff09;在深度学习领域的应用&#xff0c;为读者提供了一套丰富而实用的技术工具&#xff0c;这些工具可以贯穿深度学习的整个过程&#xff0c;助力研究者们解决各种复杂的问题。书中不仅详细介绍了遗传算法和进化…

【嵌入式DIY实例】-OLED显示DS1307/DS3231实时时钟

OLED显示DS1307/DS3231实时时钟 文章目录 OLED显示DS1307/DS3231实时时钟1、DS1307/DS1321介绍2、硬件准备3、代码实现本文将展示了如何使用ESP8266 NodeMCU开发板、DS3231 RTC 芯片和 SSD1306 OLED 显示屏(12864 像素)构建实时时钟。 DS3231 RTC有一个内置的温度传感器,我们…

力扣:344. 反转字符串

344. 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&#xff1a;s ["…

Win11禁用数字强制签名:解放硬件选择,自由安装应用

工具原料&#xff1a; 操作系统版本&#xff1a;Windows 11 品牌型号&#xff1a;任意电脑或手机品牌型号 软件版本&#xff1a;任意版本的Win11操作系统 一、禁用数字强制签名的方法 方法一&#xff1a;使用高级启动选项 在Win11中&#xff0c;可以通过高级启动选项来禁…

怎么理解直接程序控制和中断方式?

直接程序控制 看完之后是不是依然一头雾水&#xff1f;来看下面两个例子 无条件传送 假设你正在使用键盘打字。当你敲击键盘上的一个键时&#xff0c;键盘会立即产生一个信号&#xff08;即输入数据&#xff09;&#xff0c;并且这个信号会立即被电脑接收。在这个过程中&…

比较两列数据

点其中一个数据 删掉S&#xff0c;回车 大的标红

v-cloak 用于在 Vue 实例渲染完成之前隐藏绑定的元素

如果你是后端开发者&#xff08;php&#xff09;&#xff0c;在接触一些vue2开发的后台时&#xff0c;会发现有这段代码&#xff1a; # CDN <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> # 或 <script src"https://cd…

三十六计的笔记

系列文章目录 三十六计的笔记 文章目录 系列文章目录1、瞒天过海2、围魏救赵3、借刀杀人4、以逸待劳5、趁火打劫6、声东击西7、无中生有8、暗渡陈仓9、隔岸观火10、笑里藏刀11、李代桃僵12、顺手牵羊13、打草惊蛇14、借尸还魂15、调虎离山16、欲擒故纵17、抛砖引玉18、擒贼擒王…

MongoDB 单点 Docker 启动及其持久化配置

MongoDB 单点 Docker 启动及其持久化配置 Docker Image Version mongodb/mongodb-community-server:5.0-ubuntu2004 单点删除 docker rm -f mongo-single单点启动 docker run -d --name mongo-single --log-driverjson-file \ --log-opt max-size100m --log-opt max-file3…

9.3 Go语言入门(变量声明和函数调用)

Go语言入门&#xff08;变量声明和函数调用&#xff09; 目录二、变量声明和函数调用1. 变量声明1.1 使用 var 关键字声明1.2 简短声明1.3 零值1.4 常量 2. 函数调用2.1 函数定义2.2 多个返回值2.3 命名返回值2.4 可变参数2.5 匿名函数和闭包 目录 Go 语言&#xff08;Golang&a…