【QT实现TCP和UDP协议通信(二)】

文章目录

    • QT实现TCP和UDP协议通信(二)
    • Client(客户端)
      • 1.创建新项目 选择Qt Widget Application即可 。
      • 2.项目工程文件中(.pro)加入 QT += network,引入网络通信模块
      • 3.引入头文件 QTcpServer 、QTcpSocket 和QUdpSocket
      • 4.ui 界面设计 :
      • 5.Client需要的几个功能:断开连接、TCP协议连接、发送数据
      • 6.创建对象:
      • 7.源码:
      • 8.ui界面设计中新增了一些内容,可以看情况删减后编译。

QT实现TCP和UDP协议通信(二)

编程环境 :MSVC 2010 32bit
语言 :C++
作者 :wddkxg
时间 :2022.04.24
项目 :Server(服务器端) + Client(客户端)

Client(客户端)

1.创建新项目 选择Qt Widget Application即可 。

2.项目工程文件中(.pro)加入 QT += network,引入网络通信模块

3.引入头文件 QTcpServer 、QTcpSocket 和QUdpSocket

4.ui 界面设计 :

一个lineEdit用于输入端口号,一个lineEdit用于输入ip地址,一个PushButton为连接按钮,
一个PushButton为发送按钮,两个复选框可以选择TCP或UDP协议,一个lineEdit用于显示连接状态,
一个TextEdit用于输入要发送信息的文本。

【QT实现TCP和UDP协议通信(二)】_第1张图片

5.Client需要的几个功能:断开连接、TCP协议连接、发送数据

void socket_disconnected();//断开连接
void on_pushButtonconnect_clicked();//TCP连接
void on_pushButton_send_clicked();//发送数据

6.创建对象:

QTcpSocket *mSocket;//TCP套接字对象
QUdpSocket *uSocket;//UDP套接字对象

7.源码:

client.h

#ifndef APP_H
#define APP_H

#include 
#include
#include
#include
#include
#include
#include
#include

QT_BEGIN_NAMESPACE
namespace Ui { class App; }
QT_END_NAMESPACE

/*客户端*/
class App : public QMainWindow
{
    Q_OBJECT

public:
    App(QWidget *parent = nullptr);
    ~App();

public slots:
    void onTimeOut();//计时器

private slots:

    void socket_disconnected();//断开连接

    void on_pushButtonconnect_clicked();//TCP连接

    void on_pushButton_send_clicked();//发送数据

    void on_checkBox_auto_clicked(bool checked);//自动发送


private:
    Ui::App *ui;
    QTcpSocket *mSocket;//TCP套接字对象
    QUdpSocket *uSocket;//UDP套接字对象
    QTimer *tim;//定时器对象
};
#endif // APP_H

client.cpp

/*****************************************************************************************/
/*                                        客户端                                          */
/*                                        2022.03.02                                     */
/*                                        wddkxg                                         */
/*                                        v1.0                                           */
/*****************************************************************************************/
#include "client.h"
#include "ui_client.h"
#include
#include
#include

/*构造函数*/
App::App(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::App)
{
    ui->setupUi(this);
    ui->ipEdit->setText("10.0.0.58");//默认显示ip为192.168.1.44
    ui->portEdit->setText("8080");//默认显示端口为8080
    mSocket = new QTcpSocket();//TCP套接字初始化
    ui->pushButton_send->setEnabled(true);
    QObject::connect(mSocket,&QTcpSocket::readyRead,this,&App::on_pushButton_send_clicked);
    QObject::connect(mSocket,&QTcpSocket::disconnected,this,&App::socket_disconnected);
    uSocket = new QUdpSocket(this);//UDP套接字初始化

    tim = new QTimer();//初始化计时器对象
    tim->setInterval(1000);//设置计时器间隔时间为1s

    connect(tim,SIGNAL(timeout()),this,SLOT(onTimeOut()));//连接信号槽
    tim->start();//初始化计时器状态
}

/*析构函数*/
App::~App()
{
    delete this->uSocket;
    delete this->mSocket;
    delete ui;
}

/*TCP连接*/
void App::on_pushButtonconnect_clicked()
{
    if(ui->pushButtonconnect->text() == QString::fromLocal8Bit("连接"))
        {
            QString IP;
            int port;         
            IP = ui->ipEdit->text(); //获取IP地址
            port = ui->portEdit->text().toInt(); //获取端口号
            mSocket->abort();//取消已有的连接
            mSocket->connectToHost(IP, port);//连接服务器
            if(!mSocket->waitForConnected(30000))//等待连接成功
            {
                qDebug() << "Connection failed!";
                ui->lineEdit_state->setText(QString::fromLocal8Bit("连接失败!"));
                return;
            }
            qDebug() << "Connect successfully!";
            ui->lineEdit_state->setText(QString::fromLocal8Bit("连接成功!"));          
            ui->pushButton_send->setEnabled(true);//发送按键使能
            ui->pushButtonconnect->setText(QString::fromLocal8Bit("断开连接"));//修改按键文字
        }
        else
        {           
            mSocket->disconnectFromHost();//断开连接
            ui->pushButtonconnect->setText(QString::fromLocal8Bit("连接"));//修改按键文字
            ui->pushButton_send->setEnabled(true);//发送按键使能
        }
}

/*发送数据*/
void App::on_pushButton_send_clicked()
{
    qDebug()<<"Send: "<<ui->textEdit_enter->toPlainText().toLatin1();

    if(ui->radioButton_TCP->isChecked())//判断使用TCP协议
    {
        qDebug()<<"TCP";
        mSocket->write(ui->textEdit_enter->toPlainText().toLatin1());//tcp协议下客户端发送框内容写入缓冲
        mSocket->flush();
    }
    else if(ui->radioButton_UDP->isChecked())//判断使用UDP协议
    {
        qDebug()<<"UDP";
        uSocket->writeDatagram(ui->textEdit_enter->toPlainText().toLatin1(),QHostAddress("10.0.0.58"),8080);//udp协议下客户端发送框内容写入缓冲
        uSocket->flush();
    }
    else
    {
        ui->lineEdit_state->setText("choose TCP or UDP ");//未选择协议
    }
}

/*断开连接*/
void App::socket_disconnected()
{
    ui->pushButton_send->setEnabled(false);//关闭发送按键
    ui->pushButtonconnect->setText(QString::fromLocal8Bit("连接"));//显示
    qDebug()<<"Disconnected!";
}

 /*自动发送*/
void App::on_checkBox_auto_clicked(bool checked)
{
    if(checked)//判断自动发送是否选中
    {
       onTimeOut();//调用计时器延时发送
    }
}

/*设置定时器延时发送*/
void App::onTimeOut()
{
   if(ui->checkBox_auto->isChecked())//判断自动发送是否选中
    {
       static int value = 0;
       ui->progressBar->setValue(value++);

       if(value>5)//延时5秒发送一次
       {
           tim->stop();
           on_pushButton_send_clicked();
           tim->start();
           ui->progressBar->setValue(value = 0);
           ui->checkBox_auto->setChecked(false);
       }
    }

}

main1.cpp

#include "client.h"
#include 

int main(int argc, char *argv[])//主函数
{
    QApplication a(argc, argv);
    App w;
    w.show();
    w.onTimeOut();

    return a.exec();
}

8.ui界面设计中新增了一些内容,可以看情况删减后编译。

你可能感兴趣的:(练手项目,qt5,c++)