Socket之UDP
阅读原文时间:2023年07月11日阅读:1

  相对于TCP/IP来说,UDP更像是发快递和写信,不需要判断和对方是否连通就可以发送,而TCP/IP必须确认连通之后才可以发送,这样UDP通讯其实不能严格按照TCP/IP的说法区分服务器和客户端,对于每一个客户端来说,只要知道对方地址和端口就可以直接发送,看是一个客户端身份,但是要想接受来自其它客户端发来的消息,就得绑定端口号,如果不绑定,只能发送信息,不能接收,这样看又是一个服务器身份。

  • 互相访问的效果如下:

  • 参考代码如下:

      客户端.h文件:

    #ifndef UDPSOCEKT_H
    #define UDPSOCEKT_H

    #include
    #include
    #include
    #include

    namespace Ui {
    class udpSocekt;
    }

    class udpSocekt : public QWidget
    {
    Q_OBJECT

    public:
    explicit udpSocekt(QWidget *parent = );
    ~udpSocekt();

    private slots:
    void on_sendbutton_clicked();

    void on_closebutton_clicked();

    void dealdata();
    private:
    Ui::udpSocekt *ui;
    QUdpSocket *Udpsocket;
    };

    #endif // UDPSOCEKT_H

      客户端.CPP文件:

    #include "udpsocekt.h"
    #include "ui_udpsocekt.h"

    udpSocekt::udpSocekt(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::udpSocekt)
    {
    ui->setupUi(this);
    setWindowTitle("客户端1:6666");
    Udpsocket = new QUdpSocket(this);
    //绑定端口(声明自己的端口)以便别人访问
    Udpsocket->bind();
    connect(Udpsocket,&QUdpSocket::readyRead,this,&udpSocekt::dealdata);
    }

    udpSocekt::~udpSocekt()
    {
    delete ui;
    }
    void udpSocekt::dealdata()
    {
    char buf[] = {};//读取对方的内容长度
    QHostAddress Addr;//对方地址
    quint16 port;//对方端口
    qint64 str = Udpsocket->readDatagram(buf,sizeof(buf),&Addr,&port);
    if(str>)
    {
    //字符串组包
    QString showData = QString("[%1:%2] %3").arg(Addr.toString()).arg(port).arg(buf);
    ui->display->append(showData);
    }
    }
    void udpSocekt::on_sendbutton_clicked()
    {
    //从输入框获取端口和访问的IP
    QString ip = ui->ip->text();
    quint16 port = ui->port->text().toInt();
    QString text = ui->send->text();

    //执行发送
    Udpsocket->writeDatagram(text.toUtf8(),QHostAddress(ip),port);

    }

    void udpSocekt::on_closebutton_clicked()
    {
    Udpsocket->disconnectFromHost();
    Udpsocket->close();
    }