当前位置: 首页 > news >正文

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(抄袭的目的在于了解和会,没叫你超过)

相关文章:

  • Gitee的原理及应用详解(二)
  • vue data中的return
  • 使用pyqt绘制一个爱心!
  • C++ 实现深度优先搜索(DFS)的简单示例代码
  • 【OpenCV 基础知识 18】对两图像按位与操作
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • C#屏蔽基类成员
  • 【MySQL】库的基础操作
  • v-rep--lua接口和c++接口的关联
  • Docker自定义镜像
  • 探索未来直播新纪元:Voodoo Spatial 的3D 直播革命
  • Java顺序表
  • web4.0-元宇宙虚拟现实
  • CCF-GESP 等级考试 2023年12月认证C++一级真题
  • JavaScript Window对象
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • IndexedDB
  • java2019面试题北京
  • leetcode386. Lexicographical Numbers
  • Linux快速复制或删除大量小文件
  • MobX
  • Yii源码解读-服务定位器(Service Locator)
  • 分享一份非常强势的Android面试题
  • 关于extract.autodesk.io的一些说明
  • 解决iview多表头动态更改列元素发生的错误
  • 前端_面试
  • 前言-如何学习区块链
  • 浅谈web中前端模板引擎的使用
  • 算法-插入排序
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信小程序:实现悬浮返回和分享按钮
  • 微信小程序填坑清单
  • 用element的upload组件实现多图片上传和压缩
  • 自制字幕遮挡器
  • 《天龙八部3D》Unity技术方案揭秘
  • linux 淘宝开源监控工具tsar
  • Nginx实现动静分离
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (20)docke容器
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (ZT)薛涌:谈贫说富
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (南京观海微电子)——I3C协议介绍
  • (三)SvelteKit教程:layout 文件
  • (十三)Flink SQL
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (五)网络优化与超参数选择--九五小庞