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