一、介绍
UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。这样就极大地减少了系统开销,降低了流媒体的误码率和丢包率,并保证了流媒体播放的平滑性。
1、使用时需要在项目的pro中增加 QT+=network
2、使用到UDP通讯类QUdpSocket
3、服务器端需要绑定固定端口
4、客户端向服务器绑定的端口发送数据
5、服务器根据客户端连接过的IP和端口向客户端发送数据
6、使用QVariant在comboBox中保存客户端IP和端口
二、服务器代码
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("服务器8888");
connect(ui->pbSend,SIGNAL(clicked()),this,SLOT(onBtnSendClick()));
//创建socket
m_pUdpSocket = new QUdpSocket(this);
//绑定服务器端的端口,只需要绑定服务器端的IP和端口,客户端就可以和服务器通讯,服务器可以根据接收到的客户端消息,向对应的客户端发送消息
m_pUdpSocket->bind(8888);
//收数据
connect(m_pUdpSocket,&QUdpSocket::readyRead,[=](){
char buff[1024] = {0};
QHostAddress ip;
quint16 port;
m_pUdpSocket->readDatagram(buff,1023,&ip,&port);//读取客户端对象的数据、ip、端口
AddComboBox(ip,port);
QString str = QString("[%1:%2]:%3").arg(ip.toString()).arg(port).arg(buff);
ui->textEditReceive->append(str);
});
}
MainWindow::~MainWindow()
{
delete m_pUdpSocket;
delete ui;
}
void MainWindow::onBtnSendClick()
{
QVariant ipValue = ui->cbbClient->currentData();
IPInfo info = ipValue.value<IPInfo>();
QString msg = ui->textEditSend->toPlainText();
m_pUdpSocket->writeDatagram(msg.toUtf8(),info.ipAddress,info.port);
}
void MainWindow::AddComboBox(QHostAddress ipAddress, quint16 port)
{
IPInfo info;
info.ipAddress = ipAddress;
info.port = port;
QString str = QString("%1:%2").arg(info.ipAddress.toString()).arg(info.port);
QVariant ipValue = QVariant::fromValue(info);
int index = ui->cbbClient->findText(str);
if(index == -1)
{
ui->cbbClient->addItem(str,ipValue);
}
}
三、客户端
#include "MainWindow.h"
#include "ui_MainWindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle("客户端");
connect(ui->pbSend,SIGNAL(clicked()),this,SLOT(onBtnSendClick()));
m_pUdpSocket = new QUdpSocket(this);
//接收数据,接收方法和服务器代码一样
connect(m_pUdpSocket,&QUdpSocket::readyRead,[=](){
char buff[1024] = {0};
QHostAddress ip;
quint16 port;
m_pUdpSocket->readDatagram(buff,1023,&ip,&port);//读数据
ui->lineEditIP->setText(ip.toString());
ui->lineEditPort->setText(QString::number(port));
QString str = QString("[%1:%2]:%3").arg(ip.toString()).arg(port).arg(buff);
ui->textEditReceive->append(str);
});
}
MainWindow::~MainWindow()
{
delete m_pUdpSocket;
delete ui;
}
void MainWindow::onBtnSendClick()
{
QString ip = ui->lineEditIP->text();
QString port = ui->lineEditPort->text();
QString msg = ui->textEditSend->toPlainText();
m_pUdpSocket->writeDatagram(msg.toUtf8(),QHostAddress(ip),port.toUInt());
}