電信100m光纖做網(wǎng)站windows優(yōu)化軟件
推薦一個不錯的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,內(nèi)容全面,作為入門科普和學(xué)習(xí)提升都不錯,分享一下給大家:前言https://www.captainbed.cn/ai
一.UDP通信
1.QT中實現(xiàn)UDP通信主要用到了以下類:QUdpSocket、QHostAddress;
2.UdpServer是服務(wù)器端,用于監(jiān)聽客戶端發(fā)送的消息并回復(fù)同樣的消息;
??UdpClient是客戶端,用于向服務(wù)器發(fā)送一條消息,并等待來自服務(wù)器的回復(fù);
3.UDP與TCP的區(qū)別
UDP像寫信,只要知道地址就可以發(fā)
TCP像打電話,只有兩人同時在線才能通信
4.UDP多播組播
二.示例代碼
本示例代碼實現(xiàn)功能為本地管理的組播收發(fā)功能。
1.mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include ???<QUdpSocket>
#include ???<QLabel>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
????Q_OBJECT
private:
????QLabel ?*LabSocketState;
????QUdpSocket ?*udpSocket;//用于與連接的客戶端通訊的QTcpSocket
????QHostAddress ???groupAddress;//組播地址
????QString getLocalIP();//獲取本機(jī)IP地址
public:
????explicit MainWindow(QWidget *parent = 0);
????~MainWindow();
private slots:
//自定義槽函數(shù)
????void ???onSocketStateChange(QAbstractSocket::SocketState socketState);
????void ???onSocketReadyRead();//讀取socket傳入的數(shù)據(jù)
????
????void on_actStart_triggered();
????void on_actStop_triggered();
????void on_actClear_triggered();
????void on_actHostInfo_triggered();
????void on_btnMulticast_clicked();
private:
????Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
2.mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include ???<QtNetwork>
QString MainWindow::getLocalIP()
{
????QString hostName=QHostInfo::localHostName();//本地主機(jī)名
????QHostInfo ??hostInfo=QHostInfo::fromName(hostName);
????QString ??localIP="";
????QList<QHostAddress> addList=hostInfo.addresses();//
????if (!addList.isEmpty())
????for (int i=0;i<addList.count();i++)
????{
????????QHostAddress aHost=addList.at(i);
????????if (QAbstractSocket::IPv4Protocol==aHost.protocol())
????????{
????????????localIP=aHost.toString();
????????????break;
????????}
????}
????return localIP;
}
MainWindow::MainWindow(QWidget *parent) :
????QMainWindow(parent),
????ui(new Ui::MainWindow)
{
????ui->setupUi(this);
????LabSocketState=new QLabel("Socket狀態(tài):");//
????LabSocketState->setMinimumWidth(200);
????ui->statusBar->addWidget(LabSocketState);
????QString localIP=getLocalIP();//本地主機(jī)名
????this->setWindowTitle(this->windowTitle()+"----本機(jī)IP:"+localIP);
????udpSocket=new QUdpSocket(this);//用于與連接的客戶端通訊的QTcpSocket
????udpSocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);
????connect(udpSocket,SIGNAL(stateChanged(QAbstractSocket::SocketState)),
????????????this,SLOT(onSocketStateChange(QAbstractSocket::SocketState)));
????onSocketStateChange(udpSocket->state());
????connect(udpSocket,SIGNAL(readyRead()),
????????????this,SLOT(onSocketReadyRead()));
}
MainWindow::~MainWindow()
{
????udpSocket->abort();
????delete udpSocket;
????delete ui;
}
void MainWindow::onSocketStateChange(QAbstractSocket::SocketState socketState)
{
????switch(socketState)
????{
????case QAbstractSocket::UnconnectedState:
????????LabSocketState->setText("scoket狀態(tài):UnconnectedState");
????????break;
????case QAbstractSocket::HostLookupState:
????????LabSocketState->setText("scoket狀態(tài):HostLookupState");
????????break;
????case QAbstractSocket::ConnectingState:
????????LabSocketState->setText("scoket狀態(tài):ConnectingState");
????????break;
????case QAbstractSocket::ConnectedState:
????????LabSocketState->setText("scoket狀態(tài):ConnectedState");
????????break;
????case QAbstractSocket::BoundState:
????????LabSocketState->setText("scoket狀態(tài):BoundState");
????????break;
????case QAbstractSocket::ClosingState:
????????LabSocketState->setText("scoket狀態(tài):ClosingState");
????????break;
????case QAbstractSocket::ListeningState:
????????LabSocketState->setText("scoket狀態(tài):ListeningState");
????}
}
void MainWindow::onSocketReadyRead()
{//讀取數(shù)據(jù)報
????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);
????}
}
void MainWindow::on_actStart_triggered()
{//加入組播
????QString ????IP=ui->comboIP->currentText();
????groupAddress=QHostAddress(IP);//多播組地址
????quint16 ????groupPort=ui->spinPort->value();//端口
????if (udpSocket->bind(QHostAddress::AnyIPv4, groupPort, QUdpSocket::ShareAddress))//先綁定端口
????{
????????udpSocket->joinMulticastGroup(groupAddress); //加入多播組
????????ui->plainTextEdit->appendPlainText("**加入組播成功");
????????ui->plainTextEdit->appendPlainText("**組播地址IP:"+IP);
????????ui->plainTextEdit->appendPlainText("**綁定端口:"+QString::number(groupPort));
????????ui->actStart->setEnabled(false);
????????ui->actStop->setEnabled(true);
????????ui->comboIP->setEnabled(false);
????}
????else
????????ui->plainTextEdit->appendPlainText("**綁定端口失敗");
}
void MainWindow::on_actStop_triggered()
{//退出組播
????udpSocket->leaveMulticastGroup(groupAddress);//退出組播
????udpSocket->abort(); //解除綁定
????ui->actStart->setEnabled(true);
????ui->actStop->setEnabled(false);
????ui->comboIP->setEnabled(true);
????ui->plainTextEdit->appendPlainText("**已退出組播,解除端口綁定");
}
void MainWindow::on_actClear_triggered()
{
????ui->plainTextEdit->clear();
}
void MainWindow::on_actHostInfo_triggered()
{
????QString hostName=QHostInfo::localHostName();//本地主機(jī)名
????ui->plainTextEdit->appendPlainText("本機(jī)主機(jī)名:"+hostName+"\n");
????QHostInfo ??hostInfo=QHostInfo::fromName(hostName);
????QList<QHostAddress> addList=hostInfo.addresses();//
????if (!addList.isEmpty())
????for (int i=0;i<addList.count();i++)
????{
????????QHostAddress aHost=addList.at(i);
????????if (QAbstractSocket::IPv4Protocol==aHost.protocol())
????????{
????????????QString IP=aHost.toString();
????????????ui->plainTextEdit->appendPlainText("本機(jī)IP地址:"+aHost.toString());
????????????if (ui->comboIP->findText(IP)<0)
????????????????ui->comboIP->addItem(IP);
????????}
????}
}
void MainWindow::on_btnMulticast_clicked()
{//發(fā)送組播消息
????quint16 ????groupPort=ui->spinPort->value();
????QString ?msg=ui->editMsg->text();
????QByteArray ?datagram=msg.toUtf8();
????udpSocket->writeDatagram(datagram,groupAddress,groupPort);
????ui->plainTextEdit->appendPlainText("[multicst] "+msg);
????ui->editMsg->clear();
????ui->editMsg->setFocus();
}
三.測試結(jié)果
- 初始狀態(tài)
2.組播通訊結(jié)果