版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Qt編寫(xiě)TCP通訊程序客戶(hù)端與服務(wù)器端說(shuō)明:這是本人的練手之作,學(xué)習(xí)這個(gè)程序花費(fèi)了大量時(shí)間,學(xué)習(xí)過(guò)程中借鑒了網(wǎng)友的成果?,F(xiàn)在百忙之中將我的學(xué)習(xí)成果制作成學(xué)習(xí)教程供大家學(xué)習(xí)。同時(shí)我也希望大家都將自己的學(xué)習(xí)成果發(fā)布到網(wǎng)上,讓大家共享。由于我是初學(xué)者,該程序肯定會(huì)有BUG和許多需要改進(jìn)的地方。有需要討論的請(qǐng)加我的QQ:489478088,加我時(shí)請(qǐng)注明:QT學(xué)習(xí)討論?;蛘呒尤胛业腝Q群84998716。下載源代碼后,由于不同版本的QTCreator創(chuàng)建的環(huán)境不同,可能無(wú)法正確運(yùn)行,所以打開(kāi)后,QTCreator可能會(huì)提示QTCreator發(fā)現(xiàn)其他環(huán)境的配置文件,問(wèn)是否要載入,選擇No。提示如下:這時(shí)要選擇NO。如果還無(wú)法運(yùn)行,那你就只好新建一個(gè)工程,把我的源文件代碼全部復(fù)制到你的新建工程里,再運(yùn)行。下面,開(kāi)始講解如何編寫(xiě)TCP測(cè)試軟件:第一步,創(chuàng)建工程,選中QtNetwork支持,基類(lèi)選擇Widget。如果創(chuàng)建工程中沒(méi)有QtNetwork選項(xiàng),在工程建好后,在工程文件*.pro文件里QT+=coregui語(yǔ)句后面加入QT+=network否則編譯將出現(xiàn)“QNetworkInterface:Nosuchfileo”等錯(cuò)誤第二步,新建->文件或工程->選擇QT項(xiàng)目->選擇qt設(shè)計(jì)師界面類(lèi)->選擇Dialogwithoutbuttons,類(lèi)名為client,完成。編輯clientui界面,右擊空白部分,將對(duì)象名稱(chēng)改為“client”,在界面添加標(biāo)簽按鈕等,添加完成如下:第三步,服務(wù)器地址行編輯器(LineEdit)的對(duì)象名改為clientIPlineEdit;數(shù)據(jù)發(fā)送區(qū)行編輯器(LineEdit)的對(duì)象名改為clientMessagelineEdit;端口行編輯器(LineEdit)的對(duì)象名改為clientPortlineEdit;數(shù)據(jù)顯示區(qū)行編輯器(textBrowser)的對(duì)象名改為messagetextBrowser;發(fā)送按鈕的對(duì)象名改為clientSendpushButton;清空按鈕的對(duì)象名改為cCleanpushButton;連接按鈕的對(duì)象名改為connectpushButton;斷開(kāi)按鈕的對(duì)象名改為disconnectpushButton;Ready標(biāo)簽的對(duì)象名改為cStatuslabel。第四步,編輯client.h文件添加:#include<QNetworkInterface>#include<QtNetwork>2.在函數(shù)classclient:publicQDialog添加private:QList<QHostAddress>IPlist;QTcpServer*tcpServer;QTcpSocket*tcpClient;QStringclientPort;QStringserverIP;QStringclientMessage;//客戶(hù)端發(fā)出的信息QStringmessage;quint16blockSize;//存放文件的大小信息QTcpSocket*clientConnection;privateslots:voidclientSendMessage();voidupdateStatus();voidreadMessage();//接收數(shù)據(jù)out<<(quint16)(block.size()-sizeof(quint16));tcpClient->write(block);if(clientMessage.contains("clientStop"))return;ui->messagetextBrowser->insertPlainText(tr("sendmessage:%1\n").arg(clientMessage));}//客戶(hù)端錯(cuò)誤提示voidclient::displayError(QAbstractSocket::SocketError){QMessageBox::warning(this,tr("Warnning"),tcpClient->errorString());tcpClient->close();ui->connectpushButton->setEnabled(true);ui->disconnectpushButton->setEnabled(false);ui->clientSendpushButton->setEnabled(false);}//客戶(hù)端更新連接狀態(tài)voidclient::updateClientStatusConnect(){ui->cStatuslabel->setText(tr("已連接"));ui->connectpushButton->setEnabled(false);ui->disconnectpushButton->setEnabled(true);ui->clientSendpushButton->setEnabled(true);}//客戶(hù)端更新斷開(kāi)狀態(tài)voidclient::updateClientStatusDisconnect(){ui->cStatuslabel->setText(tr("已斷開(kāi)"));tcpClient->close();ui->connectpushButton->setEnabled(true);ui->disconnectpushButton->setEnabled(false);ui->clientSendpushButton->setEnabled(false);}//需要自己添加的函數(shù)voidclient::updateStatus(){//暫時(shí)為空}//客戶(hù)端讀取信息voidclient::readMessage(){QDataStreamin(tcpClient);in.setVersion(QDataStream::Qt_4_7);if(blockSize==0){//判斷接收的數(shù)據(jù)是否有兩字節(jié),也就是文件的大小信息//如果有則保存到blockSize變量中,沒(méi)有則返回,繼續(xù)接收數(shù)據(jù)if(tcpClient->bytesAvailable()<(int)sizeof(quint16))return;in>>blockSize;}if(tcpClient->bytesAvailable()<blockSize)//如果沒(méi)有得到全部的數(shù)據(jù),則返回,繼續(xù)接收數(shù)據(jù)return;in>>message;if(message.contains("serverStop"))//如果收到是服務(wù)器停止監(jiān)聽(tīng)的信息{tcpClient->close();ui->cStatuslabel->setText(tr("服務(wù)器斷開(kāi)連接"));blockSize=0;return;}ui->messagetextBrowser->insertPlainText(tr("reveivedmessage:%1\n").arg(message));blockSize=0;}//客戶(hù)端創(chuàng)建套接字voidclient::createServerSocket(){clientConnection=tcpServer->nextPendingConnection();connect(clientConnection,SIGNAL(disconnected()),clientConnection,SLOT(deleteLater()));}這樣,客戶(hù)端就編寫(xiě)好了。第六步,編輯main.cpp文件,該文件修改后如下:#include<QtGui/QApplication>#include"widget.h"#include"client.h"intmain(intargc,char*argv[]){QApplicationa(argc,argv);Widgetw;//w.show();clientw1;w1.show();returna.exec();}可以看到效果如下,注意標(biāo)題欄改成“客戶(hù)端”后可能出現(xiàn)亂碼,原因是沒(méi)有添加中文支持,如何添加中文支持將在后面講解。第七步,編輯widget.ui界面文件,添加標(biāo)簽和按鈕,如下服務(wù)器地址行編輯器(Combobox)的對(duì)象名改為serverIPcomboBox;數(shù)據(jù)發(fā)送區(qū)行編輯器(LineEdit)的對(duì)象名改為serverMessagelineEdit;端口行編輯器(LineEdit)的對(duì)象名改為serverPortlineEdit;數(shù)據(jù)顯示區(qū)行編輯器(LineEdit)的對(duì)象名改為servertextBrowser;發(fā)送按鈕的對(duì)象名改為serverSendpushButton;清空按鈕的對(duì)象名改為sCleanpushButton;偵聽(tīng)按鈕的對(duì)象名改為listenpushButton;停止按鈕的對(duì)象名改為stoppushButton;Ready標(biāo)簽的對(duì)象名改為statuslabel。第八步,編輯widget.h文件添加#include<QNetworkInterface>#include<QtNetwork>在類(lèi)classWidget:publicQWidget里面添加public:explicitWidget(QWidget*parent=0);~Widget();voidgetLocalIP();//獲取本機(jī)IP地址private:Ui::Widget*ui;QList<QHostAddress>IPlist;QTcpServer*tcpServer;QStringserverPort;QStringserverIP;QStringserverMessage;//服務(wù)端發(fā)出的信息QStringmessage;quint16blockSize;//存放文件的大小信息QTcpSocket*clientConnection;privateslots:voidserverSendMessage();voidon_listenpushButton_clicked();voidupdateStatus();voiddisplayErrorS(QAbstractSocket::SocketError);//顯示服務(wù)端錯(cuò)誤voidscreateServerSocket();voidon_sCleanpushButton_clicked();voidon_stoppushButton_clicked();voidserverReadMessage();第九步,編輯widget.cpp文件1.添加#include<QMessageBox>2.構(gòu)造函數(shù)修改如下:Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui->setupUi(this);getLocalIP();clientConnection=NULL;connect(ui->serverSendpushButton,SIGNAL(clicked()),this,SLOT(serverSendMessage()));//ui->serverSendpushButton->setEnabled(false);ui->serverSendpushButton->setEnabled(true);ui->stoppushButton->setEnabled(false);}打開(kāi)widget.ui界面,單擊界面的空白處,將界面的Windowstittle的屬性改為“服務(wù)器端”。在widget.ui界面分別右擊“清空”、“偵聽(tīng)”、“停止”按鈕,選擇“gotoslot”,信號(hào)選擇clicked().各函數(shù)修改如下://偵聽(tīng)按鈕槽函數(shù)voidWidget::on_listenpushButton_clicked(){serverPort=ui->serverPortlineEdit->text();serverIP=ui->serverIPcomboBox->currentText();if(serverPort.isEmpty()){QMessageBox::warning(this,tr("Warnning"),tr("端口號(hào)不能為空"));return;}tcpServer=newQTcpServer(this);if(!tcpServer->listen(QHostAddress::Any,serverPort.toInt())){QMessageBox::warning(this,tr("Warnning"),tcpServer->errorString());close();}connect(tcpServer,SIGNAL(newConnection()),this,SLOT(updateStatus()));connect(tcpServer,SIGNAL(newConnection()),this,SLOT(screateServerSocket()));//有新的連接到來(lái),則開(kāi)始創(chuàng)建套接字ui->statuslabel->setText(tr("開(kāi)始監(jiān)聽(tīng)"));ui->listenpushButton->setEnabled(false);ui->stoppushButton->setEnabled(true);}//清空按鈕槽函數(shù)voidWidget::on_sCleanpushButton_clicked(){ui->servertextBrowser->setText("");}//停止按鈕槽函數(shù)voidWidget::on_stoppushButton_clicked(){ui->serverMessagelineEdit->setText(tr("serverStop"));//發(fā)送服務(wù)端停止監(jiān)聽(tīng)信息serverSendMessage();ui->serverMessagelineEdit->setText(tr(""));tcpServer->close();ui->statuslabel->setText(tr("停止監(jiān)聽(tīng)"));ui->listenpushButton->setEnabled(true);ui->stoppushButton->setEnabled(false);ui->serverSendpushButton->setEnabled(false);}將其余函數(shù)補(bǔ)充完整://服務(wù)器端讀取信息voidWidget::serverReadMessage(){QDataStreamin(clientConnection);in.setVersion(QDataStream::Qt_4_7);if(blockSize==0){//判斷接收的數(shù)據(jù)是否有兩字節(jié),也就是文件的大小信息//如果有則保存到blockSize變量中,沒(méi)有則返回,繼續(xù)接收數(shù)據(jù)if(clientConnection->bytesAvailable()<(int)sizeof(quint16))return;in>>blockSize;}if(clientConnection->bytesAvailable()<blockSize)//如果沒(méi)有得到全部的數(shù)據(jù),則返回,繼續(xù)接收數(shù)據(jù)return;in>>message;if(message.contains("clientStop"))//如果收到是客戶(hù)端斷開(kāi)連接的信息{clientConnection->close();ui->serverSendpushButton->setEnabled(false);ui->statuslabel->setText(tr("客戶(hù)端斷開(kāi)連接"));blockSize=0;return;}ui->servertextBrowser->insertPlainText(tr("reveivedmessage:%1\n").arg(message));blockSize=0;}//服務(wù)器端發(fā)送信息voidWidget::serverSendMessage(){if(!clientConnection)//判斷有沒(méi)有實(shí)例化if(!(clientConnection=tcpServer->nextPendingConnection()))//沒(méi)有客戶(hù)端連接{return;}serverMessage=ui->serverMessagelineEdit->text();if(serverMessage.isEmpty()){QMessageBox::warning(this,tr("Warnning"),tr("請(qǐng)輸入發(fā)送數(shù)據(jù)"));return;}QByteArrayblock;QDataStreamout(&block,QIODevice::WriteOnly);out.setVersion(QDataStream::Qt_4_7);out<<(quint16)0;out<<serverMessage;out.device()->seek(0);out<<(quint16)(block.size()-sizeof(quint16));connect(clientConnection,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(displayErrorS(QAbstractSocket::SocketError)));clientConnection->write(block);if(serverMessage.contains("serverStop"))return;ui->servertextBrowser->insertPlainText(tr("sendmessage:%1\n").arg(serverMessage));}voidWidget::getLocalIP(){IPlist=QNetworkInterface::allAddresses();foreach(QHostAddressIP,IPlist){ui->serverIPcomboBox->addItem(IP.toString());}}//需要自己添加的函數(shù)voidWidget::updateStatus(){//暫時(shí)為空}//服務(wù)器端創(chuàng)建套接字voidWidget::screateServerSocket(){ui->statuslabel->setText(tr("客戶(hù)端已連接"));ui->serverSendpushButton->setEnabled(true);clientConnection=tcpServer->nextPendingC
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45146-2024道路車(chē)輛氣壓及氣頂液制動(dòng)系統(tǒng)試驗(yàn)方法
- 北師大版八年級(jí)物理上冊(cè)《第一章物態(tài)及其變化》章末測(cè)試卷含答案
- 北師大版四年級(jí)上冊(cè)數(shù)學(xué)教案
- 農(nóng)業(yè)循環(huán)經(jīng)濟(jì)模式提升效益
- 能源大數(shù)據(jù)分析理論與實(shí)踐 課件 1.大數(shù)據(jù)概述
- 2024屆湖南省普通高中學(xué)高考仿真模擬化學(xué)試卷含解析
- 廈門(mén)市2024-2025學(xué)年度一學(xué)期高二年級(jí)質(zhì)量檢測(cè)數(shù)學(xué)試題(定稿)
- 2024高中地理第四章自然環(huán)境對(duì)人類(lèi)活動(dòng)的影響2全球氣候變化對(duì)人類(lèi)活動(dòng)的影響課時(shí)作業(yè)含解析湘教版必修1
- 2024高中生物第二章動(dòng)物與人體生命活動(dòng)的調(diào)節(jié)第4節(jié)免疫調(diào)節(jié)訓(xùn)練含解析新人教版必修3
- 2024高考?xì)v史一輪復(fù)習(xí)方案專(zhuān)題五當(dāng)今世界政治格局的多極化趨勢(shì)專(zhuān)題綜合測(cè)驗(yàn)含解析人民版
- 噪聲監(jiān)測(cè)服務(wù)投標(biāo)方案
- 2023年中考語(yǔ)文備考之名著閱讀《經(jīng)典常談》思維導(dǎo)圖合集
- 2023年湘教版數(shù)學(xué)七年級(jí)下冊(cè)《整式的乘法》單元質(zhì)量檢測(cè)(含答案)
- 氣柜安裝工程施工方案
- GB/T 28750-2012節(jié)能量測(cè)量和驗(yàn)證技術(shù)通則
- 分子生物學(xué)本基因組及基因組學(xué)概論
- 《人工智能》全冊(cè)配套課件
- 統(tǒng)編部編版四年級(jí)道德與法治下冊(cè)優(yōu)秀課件【全冊(cè)】
- 高職大專(zhuān)《體育與健康》課程標(biāo)準(zhǔn)
- 12月1日世界艾滋病日預(yù)防艾滋病講座PPT珍愛(ài)生命預(yù)防艾滋病PPT課件(帶內(nèi)容)
- 測(cè)量?jī)x器自檢記錄表(全站儀)
評(píng)論
0/150
提交評(píng)論