QT實驗九網(wǎng)絡(luò)實驗二UDP通信_第1頁
QT實驗九網(wǎng)絡(luò)實驗二UDP通信_第2頁
QT實驗九網(wǎng)絡(luò)實驗二UDP通信_第3頁
QT實驗九網(wǎng)絡(luò)實驗二UDP通信_第4頁
QT實驗九網(wǎng)絡(luò)實驗二UDP通信_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

網(wǎng)絡(luò)實驗二UDP通信UDP(UserDatagramProtocol即用戶數(shù)據(jù)報協(xié)議)一個不可靠的,面向數(shù)據(jù)報的無連接協(xié)議。簡單的例子:現(xiàn)在幾乎每個人都使用的騰訊QQ,其聊天時就是使用UDP協(xié)議進行消息發(fā)送的。就像QQ那樣,當(dāng)有很多用戶,發(fā)送的大部分都是短消息,要求能及時響應(yīng),并且對安全性要求不是很高的情況下使用UDP協(xié)議。Qt中提供了QUdpSocket類來進行UDP數(shù)據(jù)報(datagrams)的發(fā)送和接收。名詞Socket,也就是常說的“套接字”Socket簡單地說,就是一個IP地址加一個port端口。因為要傳輸數(shù)據(jù),就要知道往哪個機子上傳送,而IP地址確定了一臺主機,但是這臺機子上可能運行著各種各樣的網(wǎng)絡(luò)程序,我們要往哪個程序中發(fā)送呢?這時就要使用一個端口來指定UDP程序。所以說,Socket指明了數(shù)據(jù)報傳輸?shù)穆窂健>帉憙蓚€程序,一個用來發(fā)送數(shù)據(jù)報,叫做客戶端;另一個用來接收數(shù)據(jù)報,叫做服務(wù)器端,均應(yīng)用UDP協(xié)議。這樣也就構(gòu)成了所謂的C/S(客戶端/服務(wù)器)編程模型。建立一個GUIapplication工程,基類選擇widget,工程文件*.pro中加入:QT+=networkmain.cpp修改如下:#include<QApplication>#include"widget.h"#include<QTextCodec>intmain(intargc,char*argv[]){QApplicationa(argc,argv);QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk"));QTextCodec::setCodecForCStrings(QTextCodec::codecForName("gbk"));Widgetw;w.show();returna.exec();}widget.cpp修改如下:#include"widget.h"#include"ui_widget.h"#include<qdatetime.h>#include<QTextCodec>Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);configFlag=false; //初始化連接參數(shù)為未連接ui->getTextEdit->ensureCursorVisible();ui->sendTextEdit->setFocus(); //程序啟動時,焦點停在發(fā)送對話框ui->ipEdit->setText("7");//設(shè)置默認的遠程端Ipui->portEdit->setText("6667");//設(shè)置默認遠程端口號//關(guān)聯(lián)快捷鍵ui->udpSendButton->setShortcut(tr("Alt+F"));localIpStr=getIp();localHostAddr=newQHostAddress(localIpStr);udpSocket1=newQUdpSocket(this);boolbindFlag=udpSocket1->bind(*localHostAddr,6665,QUdpSocket::ShareAddress);//6665為本地端口if(!bindFlag){QMessageBoxbox;box.setText(tr(‘初始化綁定socket錯誤!"));box.exec();}else{connect(udpSocket1,SIGNAL(readyRead()),this,SLOT(receive()));connect(ui->udpSendButton,SIGNAL(clicked()),this,SLOT(send()));}this->setWindowTitle(tr("基于Qt的UDP通信程序"));}voidWidget::send(){autoScroll();QStringsendStr=ui->sendTextEdit->toPlainText();QByteArraysendByteArray=sendStr.toAscii();QMessageBoxbox;if(sendStr.length()==0){box.setText(tr('請輸入發(fā)送內(nèi)容"));box.exec();}elseif(configFlag){udpSocket1->writeDatagram(sendByteArray, sendByteArray.length(),*remoteHostAddr,6667);//上面使用遠程端口//本地發(fā)送信息再信息交互窗口的顯示QDateTimetime;QStringtimeStr=time.currentDateTime().toString("yyyy-MM-ddhh:mm:ssddd");ui->getTextEdit->setTextColor(QColor("red"));ui->getTextEdit->insertPlainText(本機"+locallpStr+":"+timeStr+"\n");ui->getTextEdit->setTextColor(QColor("black"));ui->getTextEdit->insertPlainText(sendStr+"\n");ui->sendTextEdit->clear(); //點擊發(fā)送后,發(fā)送編輯框內(nèi)清零ui->sendTextEdit->setFocus(); //焦點停留在發(fā)送編輯框}elseif(!configFlag){box.setTextC請您先點擊確認按鈕!");box.exec();}}voidWidget::receive()while(udpSocket1->hasPendingDatagrams()){QTextCodec*tc=QTextCodec::codecForName("gbk");//gbkQDateTimetime;QStringtimeStr=time.currentDateTime().toString("yyyy-MM-ddhh:mm:ssddd");QByteArraydata;data.resize(udpSocket1->pendingDatagramSize());udpSocket1->readDatagram(data.data(),data.size());QStringdataStr=tc->toUnicode(data);ui->getTextEdit->setTextColor(QColor("red"));ui->getTextEdit->insertPlainText(遠程"+remotelpStr+":"+timeStr+"\n");ui->getTextEdit->setTextColor(QColor("black"));ui->getTextEdit->insertPlainText(dataStr+"\n");autoScroll();}}QStringWidget::getlp(){QList<QHostAddress>list=QNetworklnterface::allAddresses();foreach(QHostAddressaddress,list){if(tocol()==QAbstractSocket::lPv4Protocol) //我們使用lPv4地址{if(address.toString().contains("127.0."))continue;qDebug()<<"本機Ip:"<<address.toString();returnaddress.toString();}}return0;}voidWidget::autoScroll(){QTextCursorcursor=ui->getTextEdit->textCursor();cursor.movePosition(QTextCursor::End);ui->getTextEdit->setTextCursor(cursor);}Widget::~Widget(){deleteui;}voidWidget::on_clearButton_clicked(){ui->getTextEdit->clear();}voidWidget::on_configButton_clicked(){remoteIpStr=ui->ipEdit->text();QStringport=ui->portEdit->text();qDebug()<<"遠程端Ip:"<<remotelpStr<<"端口號:"<<port;remoteHostAddr=newQHostAddress(remoteIpStr);QMessageBoxbox;if(remoteIpStr.length()==0||port.length()==0||port.toInt()<1024){configFlag=false;box.setText('請正確設(shè)置遠程端Ip地址和端口號!");box.exec();}else{configFlag=true;box.setText("您設(shè)置的遠程端Ip:"+remotelpStr+"端口號:"+port);box.exec();}}voidWidget::on_exitButton_clicked(){this->close();}3)widget.h修改如下:#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include<QtNetwork/QUdpSocket>#include<QtNetwork/QHostAddress>#include<QMessageBox>#include<QHostInfo>#include<QNetworkInterface>namespaceUi{classWidget;}classWidget:publicQWidget{Q_OBJECTpublic:explicitWidget(QWidget*parent=0);~Widget();QHostAddress*localHostAddr;

QHostAddress*remoteHostAddr;QStringlocallpStr;QStringremotelpStr;QStringgetlp();voidautoScroll();privateslots:voidsend();voidreceive?voidon_clearButton_clicked();voidon_configButton_clicked();voidon_exitButton_clicked();private:Ui::Widget*ui;QUdpSocket*udpSocket1;boolconfigFlag;};#endif//WIDGET_HQLabel控件QtextEdit控件QLineEdit控件退岀uufS:送#endif//WIDGET_HQLabel控件QtextEdit控件QLineEdit控件退岀uufS:送QPushbutton控件-in=e:" ::r=_j ■端口弓:4)建立widget?ui如上圖所示。上面的為某臺機器的發(fā)送和接受程序。那么另一臺和它通信的機器發(fā)送和接受程序該如何修改,才能完成互相通信呢?實驗效果如下:QT網(wǎng)絡(luò)編程—獲取基本網(wǎng)絡(luò)信息主要涉及網(wǎng)絡(luò)模塊(QtNetworkModule)的QHostlnfo,QHostAddress,QNetworklnterface和QNetworkAddressEntry等幾個類。新建Qt4GuiApplication工程,工程名為myIP,Baseclass選擇QWidget。工程文件中加入:QT+=network。在widget.h文件中包含頭文件:#include<QtNetwork>1?使用QHostInfo獲取主機名和IP地址獲取主機名在widget.cpp文件中的構(gòu)造函數(shù)中添加代碼:QStringlocalHostName=QHostlnfo::localHostName();qDebug()<<”localHostName:“<<localHostName;這里使用了QHostlnfo類的localHostName類來獲取本機的計算機名稱。運行程序,在下面的輸出欄里的信息如下:tingF;\mylF'\debugVmylJ'.曾苗呂■…locsIHlietHaiTiE: ,Tyateilirnj2<"可以看到,獲取了計算機名。獲取本機的IP地址繼續(xù)在構(gòu)造函數(shù)中添加代碼:QHostlnfoinfo=QHostInfo::fromName(localHostName);qDebug()<<”IPAddress:"<<info.addresses();應(yīng)用QHostlnfo類的fromName()函數(shù),使用上面獲得的主機名為參數(shù),來獲取本機的信息。然后再利用QHostlnfo類的addresses()函數(shù),獲取本機的所有IP地址信息。運行程序,輸出信息如下:在這里只有一條IP地址。但是,在其他系統(tǒng)上,可能出現(xiàn)多條IP地址,其中可能包含了IPv4和IPv6的地址,一般使用IPv4的地址,所以可只輸出IPv4的地址。繼續(xù)添加代碼:foreach(QHostAddressaddress,info.addresses()){if(tocol()==QAbstractSocket::IPv4Protocol)qDebug()<<address.toString();}因為IP地址由QHostAddress類來管理,所以可以使用該類來獲取一條IP地址,然后使用該類的protocol。函數(shù)來判斷其是否為IPv4地址。如果是IPv6地址,可以使用QAbstractSocket::IPv6Protocol來判斷。最后將IP地址以QString類型輸出。運行效果如下:StartiiLgF:\myIF\debugVinyll.ese...loc£LHostN:iiTi已:,,,,yaf已i1irizk"IfAddress;(QKostkddressL6S.1.100^0:)-192'.168.1.1寥以主機名獲取IP地址在上面用本機的計算機名獲取本機的IP地址。其實QHostInfo類也可以用來獲取任意主機名的IP地址,如一個網(wǎng)站的IP地址。在這里使用lookupHost()函數(shù)。它是基于信號和槽的,一旦查找到了IP地址,就會觸發(fā)槽函數(shù)。具體用法如下。在widget.h文件中添加一個私有槽函數(shù):privateslots:voidlookedUp(constQHostInfo&host);然后在widget.cpp中的構(gòu)造函數(shù)中先將上面添加的代碼全部刪除,然后添加以下代碼:QHostInfo::lookupHost("”,this,SLOT(lookedUp(QHostInfo)));這里查詢百度網(wǎng)站的IP地址,如果查找到,就會執(zhí)行l(wèi)ookedUp()函數(shù)。在widget.cpp中添加lookedUp()函數(shù)的實現(xiàn)代碼:voidWidget::lookedUp(constQHostInfo&host){qDebug()<<host.addresses().first().toString();}輸出信息如下:Stairt.ingF:\myIF\debug\.myIF.a乂a...w202.IOS.22.5^ R2.通過QNetworkInterface類來獲取本機的IP地址和網(wǎng)絡(luò)接口信息

QNetworklnterface類提供了程序所運行時的主機的IP地址和網(wǎng)絡(luò)接口信息的列表。在每一個網(wǎng)絡(luò)接口信息中都包含了0個或多個IP地址,而每一個IP地址又包含了和它相關(guān)的子網(wǎng)掩碼和廣播地址,它們?nèi)弑环庋b在一個QNetworkAddressEntry對象中。網(wǎng)絡(luò)接口信息中也提供了硬件地址信息。將widge.cpp構(gòu)造函數(shù)中以前添加的代碼刪除,然后添加以下代碼。QList<QNetworkInterface>list=QNetworklnterface::alllnterfaces();〃獲取所有網(wǎng)絡(luò)接口的列表foreach(QNetworkInterfaceinterface,list){〃遍歷每一個網(wǎng)絡(luò)接口qDebug()<<"Device:"<<();〃設(shè)備名qDebug()<<“HardwareAddress:“<<interface.hardwareAddress();〃硬件地址QList<QNetworkAddressEntry>entryList=interface.addressEntries();〃獲取IP地

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論