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