QT 自学内容 day04 UDP 数据传输, TCP 数据传输,ui 界面设计,按钮的设计自动绑定槽函数!

1.首先是UDP 数据传输,

DP 的客户端

1.我们在自定义的类里面 定义 套接字,和时间定时器

QUdpSocket *m_udp;

QTimer *m_pTimer;

头文件:

#include //套接字

#include //时间定时器

2.在构造函数的时候我们 初始化数据  

m_udp = new QUdpSocket;//创建udp套接字
   m_pTimer = new QTimer;//创建定时器
    m_pTimer->setInterval(1000);//时间间隔1s。
    connect(m_pTimer,&QTimer::timeout,this,&udpclient::writedata);//每隔1s,发送数据,并且触发槽函数
   m_pTimer->start();//启动定时器

3.在析构函数的时候我们释放 数据

   delete m_udp;
    delete m_pTimer;

4.写槽函数

//发送数据报。
void udpclient::writedata()
{
    QByteArray data = "hello";
    m_udp->writeDatagram(data,data.size(),QHostAddress("191.161.110.1"),10001);//这里是自己主机的ip  和端口号
}

客户端的所有的代码:

udpclicent.h

#ifndef UDPCLIENT_H
#define UDPCLIENT_H

#include 
#include 
#include 
#include 

using namespace std;

class udpclient : public QObject
{
    Q_OBJECT
public:
    explicit udpclient(QObject *parent = 0);
    ~udpclient();
signals:

public slots:
    void writedata();
private:
    QUdpSocket *m_udp;
    QTimer *m_pTimer;
};

#endif // UDPCLIENT_H

mian.cpp

#include 
#include 

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    udpclient *client = new udpclient();
    return a.exec();
}

udpclient.cpp

#include "udpclient.h"
#include 


udpclient::udpclient(QObject *parent) : QObject(parent)
{
    m_udp = new QUdpSocket;//创建udp套接字


   m_pTimer = new QTimer;//创建定时器
    m_pTimer->setInterval(1000);//时间间隔1s。
    connect(m_pTimer,&QTimer::timeout,this,&udpclient::writedata);//每隔1s,发送数据
   m_pTimer->start();//启动定时器
}

udpclient::~udpclient()
{
    delete m_udp;
    delete m_pTimer;
}
//发送数据报。
void udpclient::writedata()
{
    QByteArray data = "hello";
    m_udp->writeDatagram(data,data.size(),QHostAddress("192.168.150.1"),10001);//这里是自己主机的ip  和端口号
}


2.UDP  的服务器数据的接收

1.我们在自定义的类里面 定义 套接字

QUdpSocket *m_udp;

头文件:

#include //套接字

2.在构造函数的时候我们 初始化数据  

//创建套接字
    m_udp = new QUdpSocket();
    //服务器绑定电脑ip或端口
    m_udp->bind(QHostAddress("192.168.150.1"),10001);
    //接收数据
    connect(m_udp,&QUdpSocket::readyRead,this,&udpsever::recvdat);//套接字的接收函数,来触发自定义的显示函数

3.析构函数我们,关闭套接字

delete m_udp;

4.自定义的槽函数


void udpsever::recvdat()
{
    QByteArray pa;
    if(m_udp->hasPendingDatagrams())//首先判断是否读到数据报。
    {
        pa.resize(m_udp->pendingDatagramSize());//设置字符数组的大小。
        m_udp->readDatagram(pa.data(),pa.size());//udp套接字读取数据报
        //打印pa的数据
        qDebug() << pa.data() << endl;
    }
}

5.UDP所有的代码:

udpsever.h

#ifndef UDPSEVER_H
#define UDPSEVER_H

#include 
#include 

class udpsever : public QObject
{
    Q_OBJECT
public:
    explicit udpsever(QObject *parent = 0);
    ~udpsever();
signals:

public slots:
    void recvdat();
private:
    QUdpSocket *m_udp;
};

#endif // UDPSEVER_H

main.cpp

#include 
#include "udpsever.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    udpsever *server = new udpsever;
    return a.exec();
}

udpsever.cpp

#include "udpsever.h"
#include 
#include 

udpsever::udpsever(QObject *parent) : QObject(parent)
{
    //创建套接字
    m_udp = new QUdpSocket();
    //服务器绑定电脑ip或端口
    m_udp->bind(QHostAddress("192.168.150.1"),10001);
    //接收数据
    connect(m_udp,&QUdpSocket::readyRead,this,&udpsever::recvdat);
}

udpsever::~udpsever()
{
    delete m_udp;
}

void udpsever::recvdat()
{
    QByteArray pa;
    if(m_udp->hasPendingDatagrams())//首先判断是否读到数据报。
    {
        pa.resize(m_udp->pendingDatagramSize());//设置字符数组的大小。
        m_udp->readDatagram(pa.data(),pa.size());//udp套接字读取数据报
        //打印pa的数据
        qDebug() << pa.data() << endl;
    }
}


6.UDP  总结:
客户端部分:只要初始化套接字,然后利用函数writeDatagram 发送信息。

服务器部分: 初始化套接字,绑定IP  和端口,  然后利用函数QUdpSocket::readyRead() 函数来判定是否有数据传输,激活槽函数输出数据。


7.TCP 数据的传输,

TCP 客户端的规则:

1.首先要规划号,连接的界面,ui->图片

2.类里面添加成员   QTcpSocket *m_tcp;//TCP 成员

 QT 自学内容 day04 UDP 数据传输, TCP 数据传输,ui 界面设计,按钮的设计自动绑定槽函数!_第1张图片


 8. 构造函数的初始化数据

 m_tcp = new QTcpSocket(this);
    connect(m_tcp,&QTcpSocket::connected,this,&Widget::connect_slot);//连接成功,显示提示信息
    connect(m_tcp,&QTcpSocket::readyRead,this,&Widget::readdata);//当有readyRead信号时,客户端即可接收服务器数据。
//PushButton 是直接在ui设计界面定义槽函数,没有在这里使用 connect 连接

9.客户端的所有代码:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_connect_clicked();
    void connect_slot();
    void readdata();

    void on_disconnect_clicked();

    void on_send_clicked();

private:
    Ui::Widget *ui;
    QTcpSocket *m_tcp;
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include 

//1.创建TCP套接字对象
//2.连接服务器
//3.和服务器进行通讯
//4.断开连接。

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //1.创建TCP套接字对象
    m_tcp = new QTcpSocket(this);
    connect(m_tcp,&QTcpSocket::connected,this,&Widget::connect_slot);//连接成功,显示提示信息
    connect(m_tcp,&QTcpSocket::readyRead,this,&Widget::readdata);//当有readyRead信号时,客户端即可接收服务器数据。
}

Widget::~Widget()
{
    delete ui;
}
//2.连接服务器
void Widget::on_connect_clicked()
{
    QString ip = ui->ip->text();//IP
    unsigned short port = ui->port->text().toShort();//端口
    m_tcp->connectToHost(QHostAddress(ip),port);//客户端连接服务器
    ui->connect->setEnabled(false);//连接按钮失能   //就是这是由连接按钮是否还能被使用,命令使用过后,这个按键不能被使用了
    ui->disconnect->setEnabled(true);//断开按钮使能   //就是这是由断开按钮是否还能被使用,命令使用过后,这个按键能使用了
    ui->textBrowser->append("已经连接服务器ip:"+ip);
}

void Widget::connect_slot()
{
    ui->textBrowser->append("连接上服务器了");
}

void Widget::readdata()
{
    QString data = m_tcp->readAll();
    ui->textBrowser->append(QString("服务器说:") + data);
}

void Widget::on_disconnect_clicked()
{
    ui->textBrowser->append(QString("断开服务器了。。。"));
    m_tcp->close();
    ui->connect->setEnabled(true);   //就是这是由连接按钮是否还能被使用,命令使用过后,这个按键能使用了
    ui->disconnect->setEnabled(false);//就是这是由断开按钮是否还能被使用,命令使用过后,这个按键不能使用了 。
}

void Widget::on_send_clicked()
{
    QString data = ui->textEdit->toPlainText();
    m_tcp->write(data.toUtf8());//客户端向服务器发送数据
    ui->textBrowser->append(QString("客户端说:") + data);//显示记录
    ui->textEdit->clear();//清空发送文本框。
}

10.TCP服务器的数据传输。

1.首先做好界面 ,ui -> 图片

2.做好类里面的成员对象的定义

头文件

#include

#include

成员:

QTcpServer *m_sever;//TCP服务器

QTcpSocket *m_tcp;//TCP的套接字

ui - >图片:

QT 自学内容 day04 UDP 数据传输, TCP 数据传输,ui 界面设计,按钮的设计自动绑定槽函数!_第2张图片


 11.TCP服务器的所有代码:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 
#include 

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_clicked();
    void newclient();
    void readdata();

    void on_pushButton_2_clicked();
    void clientdisconnect();

private:
    Ui::Widget *ui;
    QTcpServer *m_sever;//TCP服务器
    QTcpSocket *m_tcp;//TCP的套接字
};

#endif // WIDGET_H

main.cpp

#include "widget.h"
#include 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //第一步,创建TCP服务器m_server对象
    m_sever = new QTcpServer(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_pushButton_clicked()
{
    qDebug()<<"运行了 服务器的监听";
//第二步:设置服务器监听
    //port保存要监听的端口
    unsigned short port = ui->lineEdit->text().toShort();
    //监听本电脑的所有ip地址和port端口。
    m_sever->listen(QHostAddress::Any,port);

//第三步:响应客户端的连接
    connect(m_sever,&QTcpServer::newConnection,this,&Widget::newclient);
}

void Widget::newclient()
{
//第四步:通过nextpendingconnection函数,获取服务端的socket对象。
    ui->textBrowser->append("客户端连接上了...");
    //m_tcp是服务器m_sever的子对象,当tcpsever对象被销毁的时候,它也会自动销毁。
    //但最好显示删除,避免浪费内存。注意无法从另一个线程使用返回的QTcpSocket对象。
    //如果希望使用来自另一个线程的传入连接,需要重写incoming connection()。
    m_tcp = m_sever->nextPendingConnection();

//第五步:数据的接收
    connect(m_tcp,&QTcpSocket::readyRead,this,&Widget::readdata);
    connect(m_tcp,&QTcpSocket::disconnected,this,&Widget::clientdisconnect);
}

void Widget::readdata()
{
    QString temp = m_tcp->readAll();//服务器套接字m_tcp接收的所有数据。
    if(!temp.isEmpty())
    {
        ui->textBrowser->append("客户端说:"+temp);
    }
}

void Widget::on_pushButton_2_clicked()
{
   //发送数据
    QString sendmsg = ui->textEdit->toPlainText();
    //服务器的套接字m_tcp发送数据。
    m_tcp->write(sendmsg.toUtf8());
    if(!sendmsg.isEmpty())
    {
        ui->textBrowser->append("服务器说:"+sendmsg);
    }
    //清空“发送数据框”
    ui->textEdit->clear();
}

void Widget::clientdisconnect()
{
    //客户端断开了连接
    ui->textBrowser->append("客户端断开了连接....");
    //套接字m_tcp关闭
    m_tcp->close();
}

12.PushButton  怎么在ui 设计界面  设置槽函数!

1.找到 PushButton  按键  右键   选择  转到槽

2.选择的函数:

QT 自学内容 day04 UDP 数据传输, TCP 数据传输,ui 界面设计,按钮的设计自动绑定槽函数!_第3张图片

 


13.ui  界面设置槽函数   在代码里面 槽函数的定义规则:

查看QT帮助手册、编译生成该文件的原因是 文件中有该函数

[static] void QMetaObject::connectSlotsByName(QObject *object)
给出的说明:递归搜索给定对象的所有子对象,并将来自这些子对象的匹配信号连接到以下形式的对象插槽:

void on__();
假设我们的对象有一个类型为QPushButton的子对象,对象名为button1。捕捉按钮的clicked()信号的槽是:

void on_button1_clicked();
如果对象本身具有正确设置的对象名称,则其自身的信号也将连接到其各自的插槽。

综上所述,只要槽函数名规则是这样的:on_子对象名_信号名.


 

你可能感兴趣的:(QT,语言的学习,tcp/ip,网络协议,网络,qt)