• /  14
  • 下載費用: 9.90積分  

客戶端與服器端.doc

'客戶端與服器端.doc'
?Qt編寫TCP通訊程序 客戶端與服務器端說明:這是本人的練手之作,學習這個程序花費了大量時間,學習過程中借鑒了網友的成果?,F在百忙之中將我的學習成果制作成學習教程供大家學習。同時我也希望大家都將自己的學習成果發布到網上,讓大家共享。由于我是初學者,該程序肯定會有BUG和許多需要改進的地方。有需要討論的請加我的QQ:489478088,加我時請注明:QT學習討論?;蛘呒尤胛业腝Q群84998716。下載源代碼后,由于不同版本的QT Creator創建的環境不同,可能無法正確運行,所以打開后,QT Creator可能會提示QT Creator發現其他環境的配置文件,問是否要載入,選擇No。提示如下:這時要選擇NO。如果還無法運行,那你就只好新建一個工程,把我的源文件代碼全部復制到你的新建工程里,再運行。下面,開始講解如何編寫TCP測試軟件:第一步,創建工程,選中QtNetwork支持,基類選擇Widget。如果創建工程中沒有QtNetwork選項,在工程建好后,在工程文件*.pro文件里QT += core gui語句后面加入QT += network否則編譯將出現“QNetworkInterface: No such file o”等錯誤第二步,新建->文件或工程->選擇QT項目->選擇qt設計師界面類->選擇Dialog without buttons,類名為client,完成。編輯clientui界面,右擊空白部分,將對象名稱改為“client”,在界面添加標簽按鈕等,添加完成如下:第三步,服務器地址行編輯器(Line Edit)的對象名改為clientIPlineEdit;數據發送區行編輯器(Line Edit)的對象名改為clientMessagelineEdit;端口行編輯器(Line Edit)的對象名改為clientPortlineEdit;數據顯示區行編輯器(textBrowser)的對象名改為messagetextBrowser;發送按鈕的對象名改為clientSendpushButton;清空按鈕的對象名改為cCleanpushButton;連接按鈕的對象名改為connectpushButton;斷開按鈕的對象名改為disconnectpushButton;Ready標簽的對象名改為cStatuslabel。第四步,編輯client.h文件1. 添加:#include #include 2. 在函數class client : public QDialog添加private: QList IPlist; QTcpServer *tcpServer; QTcpSocket *tcpClient; QString clientPort; QString serverIP; QString clientMessage; //客戶端發出的信息 QString message; quint16 blockSize; //存放文件的大小信息 QTcpSocket *clientConnection;private slots: void clientSendMessage(); void updateStatus(); void readMessage(); //接收數據 void displayError(QAbstractSocket::SocketError); //顯示客戶端錯誤 void createServerSocket(); void updateClientStatusConnect(); void updateClientStatusDisconnect();void on_disconnectpushButton_clicked();void on_connectpushButton_clicked();void on_cCleanpushButton_clicked();第五步,編輯client.cpp文件1. 添加#include 2. 在構造函數Widget::Widget(QWidget *parent)添加:connect (ui->clientSendpushButton, SIGNAL(clicked()), this, SLOT(clientSendMessage())); ui->clientSendpushButton->setEnabled (false); ui->disconnectpushButton->setEnabled (false);3. 打開client.ui界面,單擊界面的空白處,將界面的Windows tittle的屬性改為“客戶端”。分別右擊“清空”、“連接”、“斷開”按鈕,選擇“go to slot” ,信號選擇clicked().各函數修改如下:void client::on_cCleanpushButton_clicked(){ ui->messagetextBrowser->setText ("");}//客戶端連接按鈕槽函數void client::on_connectpushButton_clicked(){ tcpClient = new QTcpSocket(this); connect (tcpClient, SIGNAL(readyRead()), this, SLOT(readMessage())); connect (tcpClient, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(displayError(QAbstractSocket::SocketError))); connect (tcpClient, SIGNAL(connected()), this, SLOT(updateClientStatusConnect())); //更新狀態 connect (tcpClient, SIGNAL(disconnected()), this, SLOT(updateClientStatusDisconnect())); blockSize = 0;//初始化 tcpClient->abort (); serverIP = ui->clientIPlineEdit->text (); clientPort = ui->clientPortlineEdit->text (); if(serverIP.isEmpty () || cli。省略部分。in >> blockSize; } if(clientConnection->bytesAvailable () > message; if(message.contains ("clientStop")) //如果收到是客戶端斷開連接的信息 { clientConnection->close (); ui->serverSendpushButton->setEnabled (false); ui->statuslabel->setText (tr("客戶端斷開連接")); blockSize = 0; return; } ui->servertextBrowser->insertPlainText (tr("reveived message: %1 \n").arg (message)); blockSize = 0;}//服務器端發送信息void Widget::serverSendMessage (){ if(!clientConnection) //判斷有沒有實例化 if(!(clientConnection = tcpServer->nextPendingConnection ())) //沒有客戶端連接 { return; } serverMessage = ui->serverMessagelineEdit->text (); if(serverMessage.isEmpty ()) { QMessageBox::warning (this, tr("Warnning"), tr("請輸入發送數據")); return; } QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); out.setVersion (QDataStream::Qt_4_7); out << (quint16) 0; out <seek (0); out <write (block); if(serverMessage.contains ("serverStop")) return; ui->servertextBrowser->insertPlainText (tr("send message: %1 \n").arg (serverMessage));}void Widget::getLocalIP (){ IPlist = QNetworkInterface::allAddresses (); foreach(QHostAddress IP, IPlist) { ui->serverIPcomboBox->addItem (IP.toString ()); }}//需要自己添加的函數void Widget::updateStatus(){ //暫時為空}//服務器端創建套接字void Widget::screateServerSocket (){ ui->statuslabel->setText(tr("客戶端已連接")); ui->serverSendpushButton->setEnabled (true); clientConnection = tcpServer->nextPendingConnection (); blockSize = 0;//初始化 connect (clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater())); connect (clientConnection, SIGNAL(readyRead()), this, SLOT(serverReadMessage()));} //服務器端錯誤提示void Widget::displayErrorS (QAbstractSocket::SocketError){ // QMessageBox::warning (this, tr("Warnning"), clientConnection->errorString ()); ui->servertextBrowser->insertPlainText (clientConnection->errorString ()); connect (clientConnection, SIGNAL(disconnected()), clientConnection, SLOT(deleteLater())); clientConnection->disconnectFromHost (); ui->statuslabel->setText (tr("斷開連接"));}第十步,編輯main.cpp文件,修改好后如下:#include #include //添加中文支持2-1#include "widget.h"#include "client.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecForLocale());//添加中文支持2-2 Widget w; w.show(); client w1; w1.show(); return a.exec();}其中,兩條語句便可完成中文支持。運行程序,如下:
關 鍵 詞:
客戶端
 天天文庫所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
關于本文
本文標題:客戶端與服器端.doc
鏈接地址: http://www.094347.live/p-55626919.html
關于我們 - 網站聲明 - 網站地圖 - 資源地圖 - 友情鏈接 - 網站客服點擊這里,給天天文庫發消息,QQ:1290478887 - 聯系我們

本站為“文檔C2C交易模式”,即用戶上傳的文檔直接賣給(下載)用戶,本站只是中間服務平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有【成交的100%(原創)】。本站是網絡服務平臺方,若您的權利被侵害,侵權客服QQ:1290478887 歡迎舉報。

[email protected] 2017-2027 http://www.094347.live 網站版權所有

粵ICP備19057495號 

收起
展開
有没有苹果软件赚钱的 陕西11选5走势图手机版 排列五18187期预测 中国平安股票 白小姐四肖必选一肖图 股票发行债券是利好 为什么我买五分彩提现不了 中正配资 河南省22选5预测号 玩北京pk10哪个平台好 今晚一码一肖大公开