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

相关推荐
尘中远7 小时前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia9 小时前
Qt——多线程间的互斥
开发语言·qt
尘中远14 小时前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图
尘中远14 小时前
【Qwt 7.0 系列】交互功能详解 —— 平移、缩放、坐标轴交互与数据拾取
qt·数据可视化·绘图·qcustomplot·qwt·科学绘图
sycmancia15 小时前
Qt——进程与线程的概念
qt
郝学胜-神的一滴15 小时前
Qt 高级编程 034:深耕QWidget底层内核—彻底吃透无边框窗口设计核心原理
开发语言·c++·qt·程序人生·软件开发·用户界面
尘中远16 小时前
【Qwt 7.0 系列】3D 数据可视化 —— OpenGL 高性能三维绘图
qt·3d·qcustomplot·qwt·科学绘图·高性能绘图
满天星830357716 小时前
【Qt】控件(二) (geometry及与frameGeometry的区别)
开发语言·qt
大气的小蜜蜂16 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·qt·sqlite
尘中远17 小时前
【Qwt 7.0 系列】总体架构解析 —— 从单体到三库模块化的演进
qt·matplotlib·绘图·qwt·科学绘图