前言
网络通信是程序员必须会的一项生存技能,这里简单的实现了UDP单播通信的一个小实例,代码可以直接拿来用,开发环境是Qt5.9.6。
一、UDP通信实例
1.项目架构
2.udpsendreceive.h文件
#ifndef UDPSENDRECEIVE_H
#define UDPSENDRECEIVE_H
#include <QWidget>
#include <QUdpSocket>
#include <QtNetwork>
namespace Ui {
class UdpSendReceive;
}
class UdpSendReceive : public QWidget
{
Q_OBJECT
public:
explicit UdpSendReceive(QWidget *parent = nullptr);
~UdpSendReceive();
void initNetwork(quint16 port);
void stopNetwork();
private slots:
//自定义槽函数
void onSocketReadyRead();//读取socket传入的数据
void on_pushButton_clicked();
private:
Ui::UdpSendReceive *ui;
QUdpSocket *udpSocket;//
QString getLocalIP();//获取本机IP地址
};
#endif // UDPSENDRECEIVE_H
3.udpsendreceive.cpp文件
#include "udpsendreceive.h"
#include "ui_udpsendreceive.h"
UdpSendReceive::UdpSendReceive(QWidget *parent) :
QWidget(parent),
ui(new Ui::UdpSendReceive)
{
ui->setupUi(this);
initNetwork(5555);
}
UdpSendReceive::~UdpSendReceive()
{
stopNetwork();
delete ui;
}
void UdpSendReceive::initNetwork(quint16 port)
{
udpSocket=new QUdpSocket(this);//用于与连接的客户端通讯的QTcpSocket
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));
if (udpSocket->bind(port))//绑定监听端口成功
ui->plainTextEdit->appendPlainText("***已成功绑定端口:"+QString::number(udpSocket->localPort()));
else
ui->plainTextEdit->appendPlainText("***绑定失败***");
}
void UdpSendReceive::stopNetwork()
{
udpSocket->abort(); //不能解除绑定
ui->plainTextEdit->appendPlainText("***已解除绑定***");
delete udpSocket;
}
void UdpSendReceive::onSocketReadyRead()
{//读取收到的数据报
while(udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
QHostAddress peerAddr;
quint16 peerPort;
udpSocket->readDatagram(datagram.data(),datagram.size(),&peerAddr,&peerPort);
QString str=datagram.data();
QString peer="[From "+peerAddr.toString()+":"+QString::number(peerPort)+"] ";
ui->plainTextEdit->appendPlainText(peer+str);
}
}
QString UdpSendReceive::getLocalIP()
{
QString ipString = Q_NULLPTR;
QHostInfo hostInfo = QHostInfo::fromName(QHostInfo::localHostName()); //从本地主机名称获取主机信息
QList<QHostAddress> listAddr = hostInfo.addresses(); //本地主机ip地址列表(IPV4/IPV6)
foreach (auto addr, listAddr)
{
if((addr.isNull() == false) && (addr.protocol() == QAbstractSocket::IPv4Protocol)
&& (addr != QHostAddress::LocalHost))
{
ipString = addr.toString(); //根据条件筛选出本地IPV4地址
}
}
return ipString;
}
void UdpSendReceive::on_pushButton_clicked()
{
QString msg=ui->lineEdit->text();//发送的消息内容
QByteArray str=msg.toUtf8();
QString targetIP=getLocalIP(); //目标IP
QHostAddress targetAddr(targetIP);
quint16 targetPort=5555;//目标port(同一计算机上运行需要绑定不同的端口,确保ip+port唯一)
udpSocket->writeDatagram(str,targetAddr,targetPort); //发出数据报
ui->lineEdit->setFocus();
if(ui->lineEdit->text().isEmpty())return;
ui->lineEdit->clear();
ui->plainTextEdit->appendPlainText("[发送] "+msg);
}
4.参数效果
总结
好了,这个小程序写完并可以运行进行通信,简单的实现,原理后序会专门写篇文章,这里可以直接照着上述写就OK啦,886!