QT的UDP协议

UDP协议:

客户端并不与服务器建立连接,它只负责调用发送函 数向服务器发出数据报。类似地,服务器也不从客户端接收连接,只负责调用接 收函数,等待来自某客户端的数据到达

客户端:

端口号:quint64

 

//初始化端口
quint64 port = 5555;

//1.初始化套接字。
QUdpSocket udpSocket = new QUdpSocket(this);

//2.绑定端口 (监听端口,当有程序向本机的port端口发送消息(UDP数据报)时,套接字就会收到)
//绑定固定主机的端口号,意味着我们可以限定只接收address主机发送的消息
//bool bind(const QHostAddress &address, quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)

bool result=udpSocket->bind(port);

//绑定是否成功
if(!result)
{
    QMessageBox::information(this,tr("error"),tr("udp socket create error!"));
    return;
}

 

QUdpSocket

当收到消息时该信号触发: [signal] void readyRead()

void UdpClient::dataReceived()
{
    while(udpSocket->hasPendingDatagrams())//是否有数据到达
    {
        //数据处理
        //服务器(发送者)主机地址
        QHostAddress host;
        //服务器(发送者)发送端口好
        quint16 rport;

        QByteArray datagram;
        //获取数据长度
        int size = udpSocket->pendingDatagramSize();
        datagram.resize(size);

        //读取数据
        udpSocket->readDatagram(datagram.data(),size,&host,&rport);

        //数据处理
        //将数据转换为字符串
        QString msg=QString::fromUtf8(datagram);
        ReceiveTextEdit->append(msg);
//        QString msg=datagram.data();
//        ReceiveTextEdit->insertPlainText(msg);

        qDebug()<<host<<rport;

        //数据应答
        msg = "Client:" + msg;

        //给服务器发送消息
        udpSocket->writeDatagram(msg.toUtf8(),host,rport);
    }
 }

服务端:

设置发送的端口号:quint16

UDP套接字 用来接收和发送数据的 QUdpSocket

//端口号
port = 5555;

//初始化服务端套接字
udpSocket = new QUdpSocket(this);

connect(udpSocket,&QUdpSocket::readyRead,this,&UdpServer::readData);

//初始化定时器
timer = new QTimer(this);
timer->setInterval(1000);
connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));

//绑定监听端口

//接收任意主机(地址)发送的消息
//bool bind(quint16 port = 0, QAbstractSocket::BindMode mode = DefaultForPlatform)
//端口号为0 意味着系统会自动分配监听端口号
if(!udpSocket->bind())
{
    qDebug()<<"bind error";
}

 

处理接收到的数据

void UdpServer::readData()
{
    while (udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        //获取数据长度
        int size = udpSocket->pendingDatagramSize();
        datagram.resize(size);

        //读取数据
        udpSocket->readDatagram(datagram.data(),size);

        //数据处理
        //将数据转换为字符串
        //QString msg=QString::fromUtf8(datagram);
        QString msg=datagram.data();

        qDebug()<<"recieve msg:"<<msg;
    }

}

将数据以广播发送出去

    //发送消息
    QString msg = TextLineEdit->text();

    QByteArray data = msg.toUtf8();
    if(msg=="")
    {
       return;
    }
     //QHostAddress::Broadcast 广播地址 意味着我们向当前网络中的所有主机发送消息。只要有主机监听port端口,就会接收到发送的消息。
    //发送信息
    if(udpSocket->writeDatagram(data,QHostAddress::Broadcast,port) == data.size())
    {
        qDebug()<<"send scess:"<<msg;
    }

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页