最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

QT

互联网 admin 20浏览 0评论

QT

1、UDP概述

            相对与TCP通信,UDP通信是面向无连接的,也即服务器端与客户端不需要建立连接即可发送接收数据。

           UDP的通信特点:简单轻便、不可靠、面向数据报、无连接的传输协议,可以应用在可靠性不是十分重要的场合,如短消息、广播消息等。

         适合应用的情况有以下几种:

         1、网络数据大多为短消息;

         2、拥有大量客户端;

         3、对数据安全性无特殊要求;

         4、网络负担非常重,但对响应速度要求高;

2、UDP通信

         一般在UDP通信中,不存在严格意义上的服务器端、客户端,因为不需要建立连接,可以理解为发送端、接收端。发送端向指定端口发送数据,接收端从指定端口读取数据,反之亦然。

        为了实现发送端与接收端的双向通信,在每一端需要定义两个端口:发送数据端口、接收数据端口,具体组成如下所示:

       上图可以看出,发送端将数据发送到指定的发送端口,接收端从制定的接收端口接收数据,这两个端口必须保持一致。反之亦然。

3、通信流程

1)、发送端流程

a、初始化套接字:udpSender = new QUdpSocket();

b、配置发送端口:int sendPort = 1234;

c、配置接收端口:int recvPort = 4321;

d、绑定接收端口:udpSender->bind(recvPort);

e、发送数据:udpSender->wrtiteDatagram();

f、等待接收数据:通过信号SIGNAL(readyRead())触发接收槽函数,通过readDatagram()函数读取数据。

2)、接收端流程

接收端的流程与发送端基本一致,

a、初始化套接字:udpRecv = new QUdpSocket();

b、配置发送端口:int sendPort = 4321; //该发送端口需要与发送端的接收端口保持一致;

c、配置接收端口:int recvPort = 1234; //该接收端口需要与发送端的发送端口保持一致;

d、绑定接收端口:udpRecv>bind(recvPort);

e、发送数据:udpSender->wrtiteDatagram();

f、等待接收数据:通过信号SIGNAL(readyRead())触发接收槽函数,通过readDatagram()函数读取数据。

4、具体实现

为了实现QT的Socket通信,需要在工程中的.pro文件中加入QT       += network

1)发送端

//初始化
udpSocket = new QUdpSocket(this); //创建UDP Socket
QString portStr = portLineEdit->text(); //发送数据的端口
port = portStr.toInt();portStr = portRecvLineEdit->text(); //接收数据的端口
recvPort = portStr.toInt();
bool bindResult = udpSocket->bind(recvPort);    //接收数据时,需要将SOCKET与接收端口绑定在一起
if(!bindResult)
{return;
}
//connect slot
connect(sendButton, SIGNAL(clicked()), this, SLOT(sendData()));     //绑定发送
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(recvData()));    //绑定接收//发送函数
sendData()
{QString sendStr = sendLineEdit->text();if(sendStr.isEmpty()){return;}//QString ip = "127.0.0.1";//int length = udpSocket->writeDatagram(sendStr.toStdString().c_str(), QHostAddress(ip), port);        //向指定IP的指定端口发送数据//QHostAddress::Broadcast,指定向广播地址发送int length = udpSocket->writeDatagram(sendStr.toStdString().c_str(), QHostAddress::Broadcast, port);        //向指定端口发送数据if(length != sendStr.length()){QMessageBox::information(this, "消息提示", "发送失败!");return;}
}
//接收数据函数
recvData()
{while(udpSocket->hasPendingDatagrams()){QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(), datagram.size());QString msg = datagram.data();showRecvTextEdit->insertPlainText(msg + "\n");//showRecvTextEdit->setText(msg);}
}

2)接收端

请参考发送端的实现,注意发送端口与接收端口的一一对应。

5、示例

以下为示例示意图:

访问。

QT

1、UDP概述

            相对与TCP通信,UDP通信是面向无连接的,也即服务器端与客户端不需要建立连接即可发送接收数据。

           UDP的通信特点:简单轻便、不可靠、面向数据报、无连接的传输协议,可以应用在可靠性不是十分重要的场合,如短消息、广播消息等。

         适合应用的情况有以下几种:

         1、网络数据大多为短消息;

         2、拥有大量客户端;

         3、对数据安全性无特殊要求;

         4、网络负担非常重,但对响应速度要求高;

2、UDP通信

         一般在UDP通信中,不存在严格意义上的服务器端、客户端,因为不需要建立连接,可以理解为发送端、接收端。发送端向指定端口发送数据,接收端从指定端口读取数据,反之亦然。

        为了实现发送端与接收端的双向通信,在每一端需要定义两个端口:发送数据端口、接收数据端口,具体组成如下所示:

       上图可以看出,发送端将数据发送到指定的发送端口,接收端从制定的接收端口接收数据,这两个端口必须保持一致。反之亦然。

3、通信流程

1)、发送端流程

a、初始化套接字:udpSender = new QUdpSocket();

b、配置发送端口:int sendPort = 1234;

c、配置接收端口:int recvPort = 4321;

d、绑定接收端口:udpSender->bind(recvPort);

e、发送数据:udpSender->wrtiteDatagram();

f、等待接收数据:通过信号SIGNAL(readyRead())触发接收槽函数,通过readDatagram()函数读取数据。

2)、接收端流程

接收端的流程与发送端基本一致,

a、初始化套接字:udpRecv = new QUdpSocket();

b、配置发送端口:int sendPort = 4321; //该发送端口需要与发送端的接收端口保持一致;

c、配置接收端口:int recvPort = 1234; //该接收端口需要与发送端的发送端口保持一致;

d、绑定接收端口:udpRecv>bind(recvPort);

e、发送数据:udpSender->wrtiteDatagram();

f、等待接收数据:通过信号SIGNAL(readyRead())触发接收槽函数,通过readDatagram()函数读取数据。

4、具体实现

为了实现QT的Socket通信,需要在工程中的.pro文件中加入QT       += network

1)发送端

//初始化
udpSocket = new QUdpSocket(this); //创建UDP Socket
QString portStr = portLineEdit->text(); //发送数据的端口
port = portStr.toInt();portStr = portRecvLineEdit->text(); //接收数据的端口
recvPort = portStr.toInt();
bool bindResult = udpSocket->bind(recvPort);    //接收数据时,需要将SOCKET与接收端口绑定在一起
if(!bindResult)
{return;
}
//connect slot
connect(sendButton, SIGNAL(clicked()), this, SLOT(sendData()));     //绑定发送
connect(udpSocket, SIGNAL(readyRead()), this, SLOT(recvData()));    //绑定接收//发送函数
sendData()
{QString sendStr = sendLineEdit->text();if(sendStr.isEmpty()){return;}//QString ip = "127.0.0.1";//int length = udpSocket->writeDatagram(sendStr.toStdString().c_str(), QHostAddress(ip), port);        //向指定IP的指定端口发送数据//QHostAddress::Broadcast,指定向广播地址发送int length = udpSocket->writeDatagram(sendStr.toStdString().c_str(), QHostAddress::Broadcast, port);        //向指定端口发送数据if(length != sendStr.length()){QMessageBox::information(this, "消息提示", "发送失败!");return;}
}
//接收数据函数
recvData()
{while(udpSocket->hasPendingDatagrams()){QByteArray datagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(), datagram.size());QString msg = datagram.data();showRecvTextEdit->insertPlainText(msg + "\n");//showRecvTextEdit->setText(msg);}
}

2)接收端

请参考发送端的实现,注意发送端口与接收端口的一一对应。

5、示例

以下为示例示意图:

访问。

发布评论

评论列表 (0)

  1. 暂无评论