当前位置: 代码迷 >> 综合 >> QT的UDP协议
  详细解决方案

QT的UDP协议

热度:70   发布时间:2024-03-09 05:19:12.0

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;}

 

 

  相关解决方案