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

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值