




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
QT5開發(fā)及實例(第5版)第10章Qt5網(wǎng)絡(luò)通信及實例——獲取本機網(wǎng)絡(luò)信息獲取本機網(wǎng)絡(luò)信息【例】(簡單)(CH1001)獲得本機網(wǎng)絡(luò)信息。以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項目,項目名NetworkInformation,“ClassInformation”頁基類選“QWidget”,類名命名為“NetworkInformation”。1.實現(xiàn)界面(1)頭文件networkinformation.h代碼如下。#include<QWidget>#include<QLabel>#include<QPushButton>#include<QLineEdit>#include<QGridLayout>#include<QMessageBox>classNetworkInformation:publicQWidget{Q_OBJECTpublic:NetworkInformation(QWidget*parent=0);~NetworkInformation();private:QLabel*hostLabel;QLineEdit*LineEditLocalHostName;QLabel*ipLabel;QLineEdit*LineEditAddress;QPushButton*detailBtn;QGridLayout*mainLayout;};獲取本機網(wǎng)絡(luò)信息(2)源文件networkinformation.cpp代碼如下:#include"networkinformation.h"NetworkInformation::NetworkInformation(QWidget*parent):QWidget(parent){hostLabel=newQLabel("主機名:");LineEditLocalHostName=newQLineEdit;ipLabel=newQLabel("IP地址:");LineEditAddress=newQLineEdit;detailBtn=newQPushButton("詳細");mainLayout=newQGridLayout(this);mainLayout->addWidget(hostLabel,0,0);mainLayout->addWidget(LineEditLocalHostName,0,1);mainLayout->addWidget(ipLabel,1,0);mainLayout->addWidget(LineEditAddress,1,1);mainLayout->addWidget(detailBtn,2,0,1,2);}獲取本機網(wǎng)絡(luò)信息此時,運行程序顯示界面如圖。獲取本機網(wǎng)絡(luò)信息2.獲取信息下面實現(xiàn)獲取本機網(wǎng)絡(luò)信息的功能。(1)在項目的配置文件NetworkI中添加一句:QT+=network(2)在頭文件networkinformation.h中添加如下代碼:#include<QHostInfo>#include<QNetworkInterface>public:voidgetHostInformation();publicslots:voidslotDetail();獲取本機網(wǎng)絡(luò)信息(3)實現(xiàn)功能函數(shù)和槽函數(shù)在源文件networkinformation.cpp構(gòu)造函數(shù)的最后添加:getHostInformation();connect(detailBtn,SIGNAL(clicked()),this,SLOT(slotDetail()));功能函數(shù)getHostInformation()用于獲取主機信息,實現(xiàn)代碼如下:voidNetworkInformation::getHostInformation(){QStringlocalHostName=QHostInfo::localHostName(); //(a)LineEditLocalHostName->setText(localHostName);QHostInfohostInfo=QHostInfo::fromName(localHostName); //(b)//獲取主機的IP地址列表QList<QHostAddress>listAddress=hostInfo.addresses();if(!listAddress.isEmpty()) //(c){LineEditAddress->setText(listAddress.at(1).toString());}}獲取本機網(wǎng)絡(luò)信息槽函數(shù)slotDetail()獲取與網(wǎng)絡(luò)接口相關(guān)的信息,實現(xiàn)代碼如下:voidNetworkInformation::slotDetail(){QStringdetail="";QList<QNetworkInterface>list=QNetworkInterface::allInterfaces(); //(a)for(inti=0;i<list.count();i++){QNetworkInterfaceinterface=list.at(i);detail=detail+"設(shè)備:"+()+"\n"; //(b)detail=detail+"硬件地址:"+interface.hardwareAddress()+"\n"; //(c)QList<QNetworkAddressEntry>entryList=interface.addressEntries(); //(d)for(intj=1;j<entryList.count();j++){QNetworkAddressEntryentry=entryList.at(j);detail=detail+"\t"+"IP地址:"+entry.ip().toString()+"\n";detail=detail+"\t"+"子網(wǎng)掩碼:"+mask().toString()+"\n";detail=detail+"\t"+"廣播地址:"+entry.broadcast().toString()+"\n";}}QMessageBox::information(this,"Detail",detail);}獲取本機網(wǎng)絡(luò)信息(4)運行程序啟動程序,顯示本機網(wǎng)絡(luò)基本信息如圖。單擊“詳細”按鈕,彈出如圖網(wǎng)絡(luò)詳細信息窗口。QT5開發(fā)及實例(第5版)第10章Qt5網(wǎng)絡(luò)通信及實例——基于UDP的數(shù)據(jù)通信01UDP工作原理1.UDP簡介2.UDP編程步驟UDP工作原理1.UDP簡介UDP(UserDatagramProtocol,用戶數(shù)據(jù)報協(xié)議)是一種簡單、輕量、無連接的傳輸協(xié)議,可以用在對通信可靠性要求不是很高的場合,如以下幾種情形:
網(wǎng)絡(luò)數(shù)據(jù)大多為短消息。
系統(tǒng)擁有大量客戶端。
對數(shù)據(jù)安全性無特殊要求。
網(wǎng)絡(luò)負載很重,但對響應(yīng)速度卻要求極高。UDP所收發(fā)數(shù)據(jù)的形式是報文(Datagram),通信時UDP客戶端向UDP服務(wù)器發(fā)送一定長度的請求報文,報文大小的限制與各系統(tǒng)的協(xié)議實現(xiàn)有關(guān),但不得超過其下層IP規(guī)定的64KB,UDP服務(wù)器同樣以報文做出應(yīng)答,如圖。UDP工作原理在UDP方式下,客戶端并不與服務(wù)器建立連接,它只負責調(diào)用發(fā)送函數(shù)向服務(wù)器發(fā)出數(shù)據(jù)報。類似地,服務(wù)器也不接受客戶端的連接,只是調(diào)用接收函數(shù)被動等待來自某客戶端的數(shù)據(jù)到達。UDP客戶端與UDP服務(wù)器間的交互時序如圖。UDP工作原理2.UDP編程步驟(1)初始化套接字例如,在一個即時通訊系統(tǒng)中,用戶之間的文字聊天信息、所有的系統(tǒng)協(xié)調(diào)通知消息都以UDP收發(fā)。為此,在客戶端和服務(wù)器程序的初始化代碼中,都要創(chuàng)建一個QUdpSocket對象綁定到指定端口,并將該對象的readyRead信號關(guān)聯(lián)到接收數(shù)據(jù)報的recvData函數(shù),語句如下:QUdpSocket*udpsocket=newQUdpSocket(); //創(chuàng)建套接字對象intuport=23232; //(a)udpsocket->bind(uport,QUdpSocket::BindFlag::ShareAddress|QUdpSocket::BindFlag::ReuseAddressHint); //套接字綁定到端口connect(udpsocket,SIGNAL(readyRead()),this,SLOT(recvData())); //(b)UDP工作原理(2)發(fā)送數(shù)據(jù)在初始化套接字后,通信雙方都可以調(diào)用套接字對象的writeDatagram函數(shù)發(fā)送數(shù)據(jù),語句形如:套接字對象->writeDatagram(數(shù)據(jù),地址,UDP端口號);(3)接收數(shù)據(jù)當有數(shù)據(jù)到達時,接收方程序響應(yīng)QUdpSocket的readyRead信號,一旦套接字對象中有數(shù)據(jù)可讀,即通過readDatagram函數(shù)將其讀出,代碼形如:while(套接字對象->hasPendingDatagrams()) //(a){
套接字對象->readDatagram(數(shù)據(jù),套接字對象->pendingDatagramSize()); //(b)...... //對收到的數(shù)據(jù)進行處理}02UDP應(yīng)用實例1.UDP服務(wù)器編程2.UDP客戶端編程3.運行演示UDP應(yīng)用實例【例】(簡單)(CH1002)編寫一對服務(wù)器/客戶端程序,用UDP進行字符的收發(fā)并顯示。1.UDP服務(wù)器編程以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項目,項目名UdpServer,“ClassInformation”頁基類選“QDialog”,類名命名為“UdpServer”。1)實現(xiàn)界面(1)在頭文件udpserver.h中聲明需要的各種控件,代碼如下:#include<QDialog>#include<QLabel>#include<QLineEdit>#include<QPushButton>#include<QVBoxLayout>classUdpServer:publicQDialog{Q_OBJECTpublic:UdpServer(QWidget*parent=0,Qt::WindowFlagsf=0);~UdpServer();private:QLabel*TimerLabel;QLineEdit*TextLineEdit;QPushButton*StartBtn;QVBoxLayout*mainLayout;};UDP應(yīng)用實例(2)在源文件udpserver.cpp中布局程序界面,代碼如下:#include"udpserver.h"UdpServer::UdpServer(QWidget*parent,Qt::WindowFlagsf):QDialog(parent,f){setWindowTitle("UDPServer"); //設(shè)置窗口標題/*初始化各個控件*/TimerLabel=newQLabel("計時器:",this);TextLineEdit=newQLineEdit(this);StartBtn=newQPushButton("開始",this);/*設(shè)置布局*/mainLayout=newQVBoxLayout(this);mainLayout->addWidget(TimerLabel);mainLayout->addWidget(TextLineEdit);mainLayout->addWidget(StartBtn);}此時,運行程序顯示服務(wù)器界面如圖。UDP應(yīng)用實例2)完成發(fā)送數(shù)據(jù)功能(1)在項目的配置文件UdpS中添加一句:QT+=network(2)在頭文件udpserver.h中添加需要的槽函數(shù)并聲明變量,如下:#include<QUdpSocket>#include<QTimer>publicslots:voidStartBtnClicked();voidtimeout();private:intport;boolisStarted;QUdpSocket*udpSocket;QTimer*timer;UDP應(yīng)用實例(3)實現(xiàn)槽函數(shù)在源文件udpserver.cpp中包含:#include<QHostAddress>并在構(gòu)造函數(shù)中添加如下代碼:connect(StartBtn,SIGNAL(clicked()),this,SLOT(StartBtnClicked()));port=5555; //設(shè)置UDP的端口號參數(shù),服務(wù)器定時向此端口發(fā)送廣播消息isStarted=false;udpSocket=newQUdpSocket(this); //創(chuàng)建套接字對象timer=newQTimer(this); //創(chuàng)建一個定時器//定時發(fā)送廣播消息connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));UDP應(yīng)用實例槽函數(shù)StartBtnClicked()負責啟停發(fā)送,代碼如下:voidUdpServer::StartBtnClicked(){if(!isStarted){StartBtn->setText("停止");timer->start(1000);isStarted=true;}else{StartBtn->setText("開始");isStarted=false;timer->stop();}}UDP應(yīng)用實例槽函數(shù)timeout()實現(xiàn)了發(fā)送廣播消息的功能,代碼如下:voidUdpServer::timeout(){QStringmsg=TextLineEdit->text();intlength=0;if(msg==""){return;}if((length=udpSocket->writeDatagram(msg.toLatin1(),msg.length(),QHostAddress::Broadcast,port))!=msg.length()){return;}}UDP應(yīng)用實例2.UDP客戶端編程以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項目,項目名UdpClient,“ClassInformation”頁基類選“QDialog”,類名命名為“UdpClient”。1)實現(xiàn)界面(1)在頭文件udpclient.h中聲明需要的各種控件,代碼如下:#include<QDialog>#include<QVBoxLayout>#include<QTextEdit>#include<QPushButton>classUdpClient:publicQDialog{Q_OBJECTpublic:UdpClient(QWidget*parent=0,Qt::WindowFlagsf=0);~UdpClient();private:QTextEdit*ReceiveTextEdit;QPushButton*CloseBtn;QVBoxLayout*mainLayout;};UDP應(yīng)用實例(2)在源文件udpclient.cpp中布局程序界面,代碼如下:#include"udpclient.h"UdpClient::UdpClient(QWidget*parent,Qt::WindowFlagsf):QDialog(parent,f){setWindowTitle("UDPClient"); //設(shè)置窗口標題/*初始化各個控件*/ReceiveTextEdit=newQTextEdit(this);CloseBtn=newQPushButton("Close",this);/*設(shè)置布局*/mainLayout=newQVBoxLayout(this);mainLayout->addWidget(ReceiveTextEdit);mainLayout->addWidget(CloseBtn);}運行程序顯示客戶端界面如圖。UDP應(yīng)用實例2)完成接收數(shù)據(jù)功能(1)在項目的配置文件UdpC中添加一句:QT+=network(2)在頭文件udpclient.h中添加需要的槽函數(shù)并聲明變量,如下:#include<QUdpSocket>publicslots:voidCloseBtnClicked();voiddataReceived();private:intport;QUdpSocket*udpSocket;UDP應(yīng)用實例(3)實現(xiàn)槽函數(shù)在源文件udpclient.cpp中包含:#include<QMessageBox>#include<QHostAddress>并在構(gòu)造函數(shù)中添加如下代碼:connect(CloseBtn,SIGNAL(clicked()),this,SLOT(CloseBtnClicked()));port=5555; //設(shè)置UDP的端口號參數(shù),指定在此端口上監(jiān)聽數(shù)據(jù)udpSocket=newQUdpSocket(this); //創(chuàng)建套接字對象connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));boolresult=udpSocket->bind(port); //將套接字綁定到指定的端口上if(!result){QMessageBox::information(this,"error","udpsocketcreateerror!");return;}UDP應(yīng)用實例槽函數(shù)CloseBtnClicked()只是簡單地關(guān)閉客戶端窗口:voidUdpClient::CloseBtnClicked(){close();}槽函數(shù)dataReceived()響應(yīng)QUdpSocket的readyRead()信號,一旦套接字對象中有數(shù)據(jù)可讀時,即通過readDatagram()方法將數(shù)據(jù)讀出并顯示,代碼如下:voidUdpClient::dataReceived(){while(udpSocket->hasPendingDatagrams()){QByteArraydatagram;datagram.resize(udpSocket->pendingDatagramSize());udpSocket->readDatagram(datagram.data(),datagram.size());QStringmsg=datagram.data();ReceiveTextEdit->insertPlainText(msg); //顯示數(shù)據(jù)內(nèi)容}}UDP應(yīng)用實例3.運行演示(1)同時啟動運行服務(wù)器和客戶端程序。(2)在服務(wù)器界面的文本框中輸入“hello!”,然后單擊“開始”按鈕,按鈕文本變?yōu)椤巴V埂保蛻舳司烷_始不斷地收到“hello!”字符消息并顯示在文本區(qū)。(3)當單擊服務(wù)器的“停止”按鈕后,按鈕文本又變回“開始”,客戶端也停止了字符的顯示。(4)再次單擊服務(wù)器的“開始”按鈕,客戶端又繼續(xù)接收并顯示……如此循環(huán)往復(fù)。整個演示過程的運行效果如圖。QT5開發(fā)及實例(第5版)第10章Qt5網(wǎng)絡(luò)通信及實例——基于TCP的數(shù)據(jù)通信01TCP工作原理1.TCP簡介2.TCP編程步驟TCP工作原理1.TCP簡介TCP(TransmissionControlProtocol,傳輸控制協(xié)議)是一種可靠、面向數(shù)據(jù)流且需要建立連接的傳輸協(xié)議,許多高層應(yīng)用協(xié)議(包括HTTP、FTP等)都以它為基礎(chǔ),TCP非常適合數(shù)據(jù)的連續(xù)傳輸。一個典型的TCP傳輸文件的過程如下:(1)首先啟動服務(wù)器,一段時間后啟動客戶端,它與此服務(wù)器經(jīng)過三次握手后建立連接。(2)此后的一段時間內(nèi),客戶端向服務(wù)器發(fā)送一個請求,服務(wù)器處理這個請求,并為客戶端發(fā)回一個響應(yīng)。這個過程一直持續(xù)下去,直到客戶端向服務(wù)器發(fā)一個文件結(jié)束符,并關(guān)閉客戶端連接。(3)接著服務(wù)器也關(guān)閉服務(wù)器端的連接,結(jié)束運行或等待一個新的客戶端連接。TCP工作原理TCP客戶端與TCP服務(wù)器間的交互時序如圖。TCP工作原理TCP與UDP的比較見表。比較項TCPUDP是否連接面向連接無連接傳輸可靠性可靠不可靠流量控制提供不提供工作方式全雙工可以是全雙工應(yīng)用場合大量數(shù)據(jù)少量數(shù)據(jù)速度慢快TCP工作原理2.TCP編程步驟(1)創(chuàng)建TCP服務(wù)器和套接字在服務(wù)器程序的初始化代碼中,既要創(chuàng)建一個TCP服務(wù)器對象也要創(chuàng)建一個套接字對象,語句如下:QTcpServer*tcpserver=newQTcpServer(); //創(chuàng)建TCP服務(wù)器inttport=5555 ; //TCP監(jiān)聽端口號connect(tcpserver,SIGNAL(newConnection()),this,SLOT(preTrans())); //(a)intpayloadsize=64*1024; //緩存每次收發(fā)的字節(jié)數(shù)QTcpSocket*tcpsocket=newQTcpSocket(); //創(chuàng)建套接字對象connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(recvBytes())); //(b)intbytesrecved=0; //已接收的字節(jié)數(shù)TCP工作原理(2)建立連接及準備首先,由TCP客戶端向服務(wù)器主動發(fā)起連接請求,使用語句:tcpsocket->connectToHost(地址,端口);這里的“端口”是TCP服務(wù)器上的監(jiān)聽端口。接受連接后,再由TCP服務(wù)器完成傳輸前的準備工作并啟動傳輸,這個操作是在preTrans函數(shù)中進行的,以傳輸文件為例,代碼如下://準備工作socket=tcpserver->nextPendingConnection();connect(socket,SIGNAL(bytesWritten()),this,SLOT(handleTrans()));localfile->open(QFile::OpenModeFlag::ReadOnly); //只讀模式打開文件//啟動傳輸block=localfile->read(payloadsize); //讀取一個緩存塊bytestobesend-=socket->write(block); //寫入套接字TCP工作原理(3)TCP服務(wù)器發(fā)送數(shù)據(jù)在handleTrans函數(shù)中實現(xiàn)字節(jié)流的持續(xù)發(fā)送,代碼為://進入TCP傳輸過程if(bytestobesend>0){if(bytestobesend>payloadsize){block=localfile->read(payloadsize); //每次讀入一個緩存塊}else{ //讀取最后剩余的字節(jié)block=localfile->read(bytestobesend);}bytestobesend-=socket->write(block); //寫入套接字}else{localfile->close(); //關(guān)閉文件socket->abort(); //釋放套接字tcpserver->close(); //關(guān)閉TCP服務(wù)器}TCP工作原理(4)TCP客戶端接收數(shù)據(jù)在TCP連接建立并啟動傳輸后,客戶端套接字就一直由readyRead信號所驅(qū)動而處于被動接收字節(jié)的狀態(tài),該信號關(guān)聯(lián)的recvBytes函數(shù)實現(xiàn)對字節(jié)的接收和控制,代碼為:if(bytesrecved<bytestotal){bytesrecved+=tcpsocket->bytesAvailable();block=tcpsocket->readAll(); //每次接收一個緩存塊localfile->write(block);if(bytesrecved==bytestotal){localfile->close(); //關(guān)閉文件tcpsocket->abort(); //釋放套接字bytesrecved=0; //復(fù)位...... //后續(xù)處理}}02TCP應(yīng)用實例1.TCP服務(wù)器編程2.TCP客戶端編程3.運行演示TCP應(yīng)用實例【例】(難度中等)(CH1003)實現(xiàn)一個基于TCP的網(wǎng)絡(luò)聊天室應(yīng)用。1.TCP服務(wù)器編程以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項目,項目名TcpServer,“ClassInformation”頁基類選“QDialog”,類名命名為“TcpServer”。1)實現(xiàn)界面(1)在頭文件tcpserver.h中聲明需要的各種控件,代碼如下:#include<QDialog>#include<QListWidget>#include<QLabel>#include<QLineEdit>#include<QPushButton>#include<QGridLayout>classTcpServer:publicQDialog{Q_OBJECTpublic:TcpServer(QWidget*parent=0,Qt::WindowFlagsf=0);~TcpServer();private:QListWidget*ContentListWidget;QLabel*PortLabel;QLineEdit*PortLineEdit;QPushButton*CreateBtn;QGridLayout*mainLayout;};TCP應(yīng)用實例(2)在源文件tcpserver.cpp中布局程序界面,代碼如下:#include"tcpserver.h"TcpServer::TcpServer(QWidget*parent,Qt::WindowFlagsf):QDialog(parent,f){setWindowTitle("TCPServer");ContentListWidget=newQListWidget;PortLabel=newQLabel("端口:");PortLineEdit=newQLineEdit;CreateBtn=newQPushButton("創(chuàng)建聊天室");mainLayout=newQGridLayout(this);mainLayout->addWidget(ContentListWidget,0,0,1,2);mainLayout->addWidget(PortLabel,1,0);mainLayout->addWidget(PortLineEdit,1,1);mainLayout->addWidget(CreateBtn,2,0,1,2);}TCP應(yīng)用實例運行程序顯示服務(wù)器界面如圖。TCP應(yīng)用實例2)完成聊天室服務(wù)器端功能(1)創(chuàng)建TCP套接字類在項目中添加C++類TcpClientSocket繼承自QTcpSocket,作為套接字在服務(wù)器端實現(xiàn)與客戶端程序的通信。套接字類頭文件tcpclientsocket.h的代碼為:#include<QTcpSocket>#include<QObject>classTcpClientSocket:publicQTcpSocket{Q_OBJECT//添加宏(Q_OBJECT)是為了實現(xiàn)信號與槽的通信public:TcpClientSocket(QObject*parent=0);signals:voidupdateClients(QString,int);voiddisconnected(int);protectedslots:voiddataReceived();voidslotDisconnected();};TCP應(yīng)用實例在套接字類源文件tcpclientsocket.cpp的構(gòu)造函數(shù)中關(guān)聯(lián)信號與槽:#include"tcpclientsocket.h"TcpClientSocket::TcpClientSocket(QObject*parent){connect(this,SIGNAL(readyRead()),this,SLOT(dataReceived()));connect(this,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));}TCP應(yīng)用實例其中,disconnected()信號在斷開連接時發(fā)出。當有數(shù)據(jù)到來時,觸發(fā)槽函數(shù)dataReceived(),代碼如下:voidTcpClientSocket::dataReceived(){while(bytesAvailable()>0){intlength=bytesAvailable();charbuf[1024];read(buf,length);QStringmsg=buf;emitupdateClients(msg,length);}}該函數(shù)從套接字中將有效數(shù)據(jù)取出,然后發(fā)出updateClients()信號,此信號是通知服務(wù)器向聊天室內(nèi)的所有成員廣播消息。槽函數(shù)slotDisconnected()的代碼為:voidTcpClientSocket::slotDisconnected(){emitdisconnected(this->socketDescriptor());}TCP應(yīng)用實例(2)創(chuàng)建TCP服務(wù)器類在項目中添加C++類Server繼承自QTcpServer,作為TCP服務(wù)器監(jiān)聽指定端口的TCP連接請求。服務(wù)器類頭文件server.h的代碼為:#include<QTcpServer>#include<QObject>#include"tcpclientsocket.h" //包含TCP套接字classServer:publicQTcpServer{Q_OBJECT //添加宏(Q_OBJECT)是為了實現(xiàn)信號與槽的通信public:Server(QObject*parent=0,intport=0);QList<TcpClientSocket*>tcpClientSocketList;signals:voidupdateServer(QString,int);publicslots:voidupdateClients(QString,int);voidslotDisconnected(int);protected:voidincomingConnection(intsocketDescriptor);};TCP應(yīng)用實例在服務(wù)器類源文件server.cpp的構(gòu)造函數(shù)中開啟監(jiān)聽:#include"server.h"Server::Server(QObject*parent,intport):QTcpServer(parent){listen(QHostAddress::Any,port);}其中,參數(shù)QHostAddress::Any表示在指定的端口對任意地址進行監(jiān)聽。TCP應(yīng)用實例(3)實現(xiàn)服務(wù)器函數(shù)當出現(xiàn)一個新的連接時,QTcpSever觸發(fā)incomingConnection()函數(shù),其參數(shù)socketDescriptor指定了連接的Socket描述符,該函數(shù)的代碼如下:voidServer::incomingConnection(intsocketDescriptor){TcpClientSocket*tcpClientSocket=newTcpClientSocket(this); //(a)connect(tcpClientSocket,SIGNAL(updateClients(QString,int)),this,SLOT(updateClients(QString,int))); //(b)connect(tcpClientSocket,SIGNAL(disconnected(int)),this,SLOT(slotDisconnected(int))); //(c)tcpClientSocket->setSocketDescriptor(socketDescriptor); //(d)tcpClientSocketList.append(tcpClientSocket); //(e)}TCP應(yīng)用實例槽函數(shù)updateClients()將任意客戶端發(fā)來的消息進行廣播,保證聊天室的所有成員均能看到其他人的發(fā)言,代碼如下:voidServer::updateClients(QStringmsg,intlength){emitupdateServer(msg,length); //(a)for(inti=0;i<tcpClientSocketList.count();i++) //(b){QTcpSocket*item=tcpClientSocketList.at(i);if(item->write(msg.toLatin1(),length)!=length){continue;}}}TCP應(yīng)用實例槽函數(shù)slotDisconnected()實現(xiàn)從tcpClientSocketList列表中將斷開連接的TcpClientSocket對象刪除的功能,代碼如下:voidServer::slotDisconnected(intdescriptor){for(inti=0;i<tcpClientSocketList.count();i++){QTcpSocket*item=tcpClientSocketList.at(i);if(item->socketDescriptor()==descriptor){tcpClientSocketList.removeAt(i);return;}}return;}TCP應(yīng)用實例(4)主程序創(chuàng)建TCP服務(wù)器在頭文件tcpserver.h中添加如下內(nèi)容:#include"server.h"private:intport;Server*server;publicslots:voidslotCreateServer();voidupdateServer(QString,int);在源文件tcpserver.cpp的構(gòu)造函數(shù)中添加如下代碼:port=8010;PortLineEdit->setText(QString::number(port));connect(CreateBtn,SIGNAL(clicked()),this,SLOT(slotCreateServer()));TCP應(yīng)用實例其中,槽函數(shù)slotCreateServer()用于創(chuàng)建一個TCP服務(wù)器,代碼如下:voidTcpServer::slotCreateServer(){server=newServer(this,port); //創(chuàng)建一個服務(wù)器對象connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(updateServer(QString,int)));CreateBtn->setEnabled(false);}這里將服務(wù)器對象的updateServer信號與槽函數(shù)updateServer進行連接,該函數(shù)用于更新服務(wù)器上的信息顯示,代碼為:voidTcpServer::updateServer(QStringmsg,intlength){ContentListWidget->addItem(msg.left(length));}(5)最后,不要忘了在項目的配置文件TcpS中添加一句:QT+=networkTCP應(yīng)用實例2.TCP客戶端編程以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項目,項目名TcpClient,“ClassInformation”頁基類
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合同解除條件合同范本
- 反擔保合同范例app
- 小學(xué)課題申報書 寫字
- 高校省級課題申報書
- 員工合同范本表
- 師德建設(shè)課題申報書
- 企業(yè)員工租房合同范本
- 吉安農(nóng)村生意轉(zhuǎn)讓合同范例
- 申報課題沒申報書
- 醫(yī)療務(wù)工合同范本武威市
- 2025年國航機務(wù)系統(tǒng)AMECO工程師崗位校園招聘筆試參考題庫附帶答案詳解
- 《物聯(lián)網(wǎng)中間件》課件
- 2025年中國建材集團所屬中建材聯(lián)合投資有限公司招聘筆試參考題庫附帶答案詳解
- 水幕噴淋系統(tǒng)的工作原理與應(yīng)用
- 門樓施工方案
- 全國職業(yè)院校技能大賽高職組(康復(fù)治療技術(shù)賽項)考試及答案
- 2024年08月河北唐山銀行第二批社會招考筆試歷年參考題庫附帶答案詳解
- 小學(xué)生拗九節(jié)課件
- 《智能制造技術(shù)基礎(chǔ)》課件-第2章 智能系統(tǒng)方案與設(shè)計
- 人教版PEP小學(xué)五年級英語下冊全冊教案(含計劃)
- 2025年幼兒園膳食工作計劃
評論
0/150
提交評論