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

相关推荐
Trouvaille ~6 小时前
PyQt5 超详细入门级教程上篇
开发语言·qt
深蓝海拓6 小时前
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
数据库·python·qt·pyqt
北顾南栀倾寒17 小时前
[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
开发语言·网络·c++·qt·tcp/ip·http·udp
Chris·Bosh17 小时前
QT:控件属性及常用控件(3)-----输入类控件(正则表达式)
qt·正则表达式·命令模式
计算机内卷的N天18 小时前
UI样式表(悬停hover状态样式和按下pressed)
qt
JANG102421 小时前
【Qt】窗口
开发语言·qt
年轮不改1 天前
Qt基础项目篇——Qt版Word字处理软件
c++·qt
Wyn_2 天前
【QT】窗口/界面置于最前端显示,且激活该窗口
qt
千千道2 天前
QT 中 UDP 的使用
开发语言·qt·udp
0xCC说逆向3 天前
Windows图形界面(GUI)-QT-C/C++ - QT 窗口属性
c语言·开发语言·c++·windows·qt·mfc