成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Qt TCP協議 傳輸簡單字符串實例

移動開發
TCP協議的程序使用的是客戶端/服務器模式,在Qt中提供了QTcpSocket類來編寫客戶端程序,使用QTcpServer類編寫服務器端程序。

Qt TCP協議 傳輸簡單字符串實例是本文要介紹的內容。TCP即Transmission Control Protocol,傳輸控制協議。與UDP不同,它是面向連接和數據流的可靠傳輸協議。也就是說,它能使一臺計算機上的數據無差錯的發往網絡上的其他計算機,所以當要傳輸大量數據時,我們選用TCP協議。

TCP協議的程序使用的是客戶端/服務器模式,在Qt中提供了QTcpSocket類來編寫客戶端程序,使用QTcpServer類編寫服務器端程序。我們在服務器端進行端口的監聽,一旦發現客戶端的連接請求,就會發出newConnection()信號,我們可以關聯這個信號到我們自己的槽函數,進行數據的發送。而在客戶端,一旦有數據到來就會發出readyRead()信號,我們可以關聯此信號,進行數據的接收。其實,在程序中最難理解的地方就是程序的發送和接收了,為了讓大家更好的理解,我們在這一節只是講述一個傳輸簡單的字符串的例子,在下一節再進行擴展,實現任意文件的傳輸。

一、服務器端。

在服務器端的程序中,我們監聽本地主機的一個端口,這里使用6666,然后我們關聯newConnection()信號與自己寫的sendMessage()槽函數。就是說一旦有客戶端的連接請求,就會執行sendMessage()函數,在這個函數里我們發送一個簡單的字符串

1.我們新建Qt4 Gui Application,工程名為“tcpServer”,選中QtNetwork模塊,Base class選擇QWidget。(說明:如果一些Qt Creator版本沒有添加模塊一項,我們就需要在工程文件tcpServer.pro中添加一行代碼:QT += network)

2.我們在widget.ui的設計區添加一個Label,更改其objectName為statusLabel,用于顯示一些狀態信息。如下:

Qt TCP協議 傳輸簡單字符串實例


 
3.在widget.h文件中做以下更改。

添加頭文件:#include <QtNetWork>

添加private對象:QTcpServer *tcpServer;

添加私有槽函數:

  1. private slots:  
  2. void sendMessage(); 

4.在widget.cpp文件中進行更改。在其構造函數中添加代碼:

  1. tcpServer = new QTcpServer(this);  
  2.     if(!tcpServer->listen(QHostAddress::LocalHost,6666))  
  3.     {  //監聽本地主機的6666端口,如果出錯就輸出錯誤信息,并關閉  
  4.         qDebug() << tcpServer->errorString();  
  5.         close();  
  6.     }  
  7.  connect(tcpServer,SIGNAL(newConnection()),this,SLOT(sendMessage()));  
  8. //連接信號和相應槽函數 

我們在構造函數中使用tcpServer的listen()函數進行監聽,然后關聯了newConnection()和我們自己的sendMessage()函數。下面我們實現sendMessage()函數。

  1. void Widget::sendMessage()  
  2. {  
  3.     QByteArray block; //用于暫存我們要發送的數據  
  4.     QDataStream out(&block,QIODevice::WriteOnly);  
  5.     //使用數據流寫入數據  
  6.     out.setVersion(QDataStream::Qt_4_6);  
  7.     //設置數據流的版本,客戶端和服務器端使用的版本要相同  
  8.     out<<(quint16) 0;  
  9.     out<<tr(“hello Tcp!!!”);  
  10.     out.device()->seek(0);  
  11.     out<<(quint16) (block.size() – sizeof(quint16));  
  12.     QTcpSocket *clientConnection = tcpServer->nextPendingConnection();  
  13.     //我們獲取已經建立的連接的子套接字  
  14.     connect(clientConnection,SIGNAL(disconnected()),clientConnection,  
  15.             SLOT(deleteLater()));  
  16.     clientConnection->write(block);  
  17.     clientConnection->disconnectFromHost();  
  18.     ui->statusLabel->setText(“send message successful!!!”);  
  19.     //發送數據成功后,顯示提示  

這個是數據發送函數,我們主要介紹兩點:

(1)為了保證在客戶端能接收到完整的文件,我們都在數據流的最開始寫入完整文件的大小信息,這樣客戶端就可以根據大小信息來判斷是否接受到了完整的文件。而在服務器端,我們在發送數據時就要首先發送實際文件的大小信息,但是,文件的大小一開始是無法預知的,所以我們先使用了out<<(quint16) 0;在block的開始添加了一個quint16大小的空間,也就是兩字節的空間,它用于后面放置文件的大小信息。然后out<<tr(“hello Tcp!!!”);輸入實際的文件,這里是字符串。當文件輸入完成后我們在使用out.device()->seek(0);返回到block的開始,加入實際的文件大小信息,也就是后面的代碼,它是實際文件的大小:out<<(quint16) (block.size() – sizeof(quint16));

(2)在服務器端我們可以使用tcpServer的nextPendingConnection()函數來獲取已經建立的連接的Tcp套接字,使用它來完成數據的發送和其它操作。比如這里,我們關聯了disconnected()信號和deleteLater()槽函數,然后我們發送數據

  1. clientConnection->write(block); 

然后是clientConnection->disconnectFromHost();它表示當發送完成時就會斷開連接,這時就會發出disconnected()信號,而最后調用deleteLater()函數保證在關閉連接后刪除該套接字clientConnection。

5.這樣服務器的程序就完成了,我們先運行一下程序。

Qt TCP協議 傳輸簡單字符串實例

 

 

 

#p#
 
二、客戶端。

我們在客戶端程序中向服務器發送連接請求,當連接成功時接收服務器發送的數據。

1.我們新建Qt4 Gui Application,工程名為“tcpClient”,選中QtNetwork模塊,Base class選擇QWidget。

2,我們在widget.ui中添加幾個標簽Label和兩個Line Edit以及一個按鈕Push Button。

Qt TCP協議 傳輸簡單字符串實例
 
其中“主機”后的Line Edit的objectName為hostLineEdit,“端口號”后的為portLineEdit。“收到的信息”標簽的objectName為messageLabel 。

3.在widget.h文件中做更改。

添加頭文件:#include <QtNetwork>

添加private變量:

  1. QTcpSocket *tcpSocket;  
  2. QString message;  //存放從服務器接收到的字符串  
  3. quint16 blockSize;  //存放文件的大小信息 

添加私有槽函數:

  1. private slots:  
  2.     void newConnect(); //連接服務器  
  3.     void readMessage();  //接收數據  
  4. void displayError(QAbstractSocket::SocketError);  //顯示錯誤 

4.在widget.cpp文件中做更改。

(1)在構造函數中添加代碼:

  1. tcpSocket = new QTcpSocket(this);  
  2. connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readMessage()));  
  3. connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),  
  4.          this,SLOT(displayError(QAbstractSocket::SocketError))); 

這里關聯了tcpSocket的兩個信號,當有數據到來時發出readyRead()信號,我們執行讀取數據的readMessage()函數。當出現錯誤時發出error()信號,我們執行displayError()槽函數。

(2)實現newConnect()函數。

  1. void Widget::newConnect()  
  2. {  
  3.     blockSize = 0; //初始化其為0  
  4.     tcpSocket->abort(); //取消已有的連接  
  5.     tcpSocket->connectToHost(ui->hostLineEdit->text(),  
  6.                              ui->portLineEdit->text().toInt());  
  7.     //連接到主機,這里從界面獲取主機地址和端口號  

這個函數實現了連接到服務器,下面會在“連接”按鈕的單擊事件槽函數中調用這個函數。

(3)實現readMessage()函數。

  1. void Widget::readMessage()  
  2. {  
  3.     QDataStream in(tcpSocket);  
  4.     in.setVersion(QDataStream::Qt_4_6);  
  5.     //設置數據流版本,這里要和服務器端相同  
  6.     if(blockSize==0) //如果是剛開始接收數據  
  7.     {  
  8.         //判斷接收的數據是否有兩字節,也就是文件的大小信息  
  9.         //如果有則保存到blockSize變量中,沒有則返回,繼續接收數據  
  10.         if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;  
  11.         in >> blockSize;  
  12.     }  
  13.     if(tcpSocket->bytesAvailable() < blockSize) return;  
  14.     //如果沒有得到全部的數據,則返回,繼續接收數據  
  15.     in >> message;  
  16.     //將接收到的數據存放到變量中  
  17.     ui->messageLabel->setText(message);  
  18.     //顯示接收到的數據  

這個函數實現了數據的接收,它與服務器端的發送函數相對應。首先我們要獲取文件的大小信息,

  1. void Widget::displayError(QAbstractSocket::SocketError)  
  2. {  
  3.     qDebug() << tcpSocket->errorString(); //輸出錯誤信息  

然后根據文件的大小來判斷是否接收到了完整的文件。

(4)實現displayError()函數。

這里簡單的實現了錯誤信息的輸出。

(5)我們在widget.ui中進入“連接”按鈕的單擊事件槽函數,然后更改如下。

  1. void Widget::on_pushButton_clicked() //連接按鈕  
  2. {  
  3.     newConnect(); //請求連接  

這里直接調用了newConnect()函數。

5.我們運行程序,同時運行服務器程序,然后在“主機”后填入“localhost”,在“端口號”后填入“6666”,點擊“連接”按鈕,效果如下。

Qt TCP協議 傳輸簡單字符串實例
 
可以看到我們正確地接收到了數據。因為服務器端和客戶端是在同一臺機子上運行的,所以我這里填寫了“主機”為“localhost”,如果你在不同的機子上運行,需要在“主機”后填寫其正確的IP地址。

小結:Qt TCP協議傳輸簡單字符串實例,到這里我們最簡單的TCP應用程序就完成了,在下一節我們將會對它進行擴展,實現任意文件的傳輸。

責任編輯:zhaolei 來源: 互聯網
相關推薦

2010-06-17 17:48:05

TCP傳輸控制協議

2023-02-09 08:43:11

SwiftGo字符串

2010-06-09 13:54:13

TCP傳輸協議

2010-06-09 16:28:50

TCP IP傳輸協議

2010-06-09 13:21:30

TCP傳輸層協議

2010-06-13 15:32:57

TCP協議

2013-05-27 10:48:16

TCPUDP傳輸協議

2010-06-17 23:21:16

TCP傳輸控制協議

2009-08-26 13:24:54

C#字符串

2010-06-13 14:49:40

TCP IP協議優化

2010-09-13 15:06:40

sql server字

2010-03-03 09:12:25

.NET字符串拘留池

2021-10-11 10:41:14

TCP傳輸層協議網絡

2011-06-16 17:01:21

Qt MeeGo 排序

2009-09-01 17:41:53

C#截取字符串函數

2019-08-15 07:43:38

TCP網絡協議丟包

2020-08-31 19:19:27

TCPUDP視屏面試

2009-08-21 14:33:15

C#異步傳輸字符串

2009-08-21 14:25:23

C#異步傳輸字符串

2020-05-13 12:17:33

RedisC字符C語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人在线中文字幕 | 中文一区二区 | 成人精品一区二区三区中文字幕 | 国产亚洲成av人在线观看导航 | 99久久国产免费 | 欧美亚洲国产精品 | 一区二区三区久久久 | 国产精品一区在线观看 | 看毛片的网站 | 色秀网站| 国产精品久久久久久久久免费 | 精品久久成人 | 国产精品不卡一区二区三区 | 草久在线| 日韩在线观看一区 | 欧美色综合天天久久综合精品 | av天天看 | 国产激情视频在线 | 日日操夜夜操天天操 | 夜夜骑av| 丝袜美腿一区二区三区动态图 | 香蕉视频一区二区 | 精品亚洲永久免费精品 | 国产成人午夜精品影院游乐网 | 一级片在线免费播放 | www.黄色片视频 | 中文字幕 在线观看 | 久久亚洲视频 | 国内精品久久影院 | 亚洲情侣视频 | 国产91丝袜 | 国产成人叼嘿视频在线观看 | 国产精品永久免费 | 色在线免费视频 | 91不卡 | 国产精品成人一区二区三区夜夜夜 | 91污在线 | 在线观看av网站 | 日本一区二区视频 | 亚洲一区二区av | 青青草一区 |