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