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

相关推荐
9527华安43 分钟前
紫光同创FPGA实现AD7606数据采集转UDP网络传输,提供PDS工程源码和技术支持和QT上位机
网络·qt·fpga开发·udp·紫光同创·ad7606
yxc_inspire1 小时前
基于Qt的app开发第七天
开发语言·c++·qt·app
dot to one3 小时前
Qt 中 QWidget涉及的常用核心属性介绍
开发语言·c++·qt
码农新猿类4 小时前
初入OpenCV
qt·opencv·计算机视觉
洛克希德马丁6 小时前
QLineEdit增加点击回显功能
c++·qt·ui
向日葵xyz7 小时前
Qt5与现代OpenGL学习(十一)OpenGL Widget鼠标控制直线旋转
开发语言·qt·学习
小宋加油啊8 小时前
Mac QT水平布局和垂直布局
开发语言·qt·macos
伐尘20 小时前
【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64
windows·qt·visual studio
吃面不喝汤6620 小时前
破解 Qt QProcess 在 Release 模式下的“卡死”之谜
开发语言·qt
charlie1145141911 天前
逐步理解Qt信号与槽机制
数据库·qt