48.QT-網絡通訊講解1

網絡概念算法

  • MAC地址(硬件地址)
  • 網絡IP地址(如192.168.1.101)
  • 網絡端口(實現多路通訊,用來給不一樣應用程序來區分使用,範圍0~65535,好比瀏覽網頁服務(80端口), FTP服務(21端口) )

交換機和路由器編程

  • 路由器在網絡層,路由器能夠處理TCP/IP協議,交換機不能夠.
  • 交換機在中繼層。路由器根據IP地址尋址,交換機根據MAC地址尋址。
  • 路由器提供防火牆的服務,具備虛擬撥號上網功能,交換機不具有這些功能。

交換機安全

端到端轉發,基於MAC地址實現不一樣設備間的數據轉發,轉發速度快.服務器

路由器網絡

根據實際數據路線轉發,基於網絡IP地址實現不一樣網絡間的數據轉發多線程

靜態路由異步

指網絡管理員配置好的轉發路徑,可以直接肯定數據路線轉發,大型和複雜的網絡環境一般不宜採用靜態路由,當連線一改變,則靜態路由須要從新配置socket

動態路由函數

路由器根據算法自動地創建本身的路由表實現數據轉發,因爲須要路由器之間頻繁地交換各自的路由表,從而安全保密性低.學習

 

網絡協議

爲數據交換而創建的規則、標準或約定的集合

協議棧

 

如上圖所示,能夠看到應用層的FTP協議是基於傳輸層的TCP協議來實現文件共享傳輸.而傳輸層的TCP協議則基於網絡層的IP實現的

默認狀況下FTP協議使用TCP端口中的 20和21這兩個端口,其中20用於傳輸數據,21用於傳輸控制信息

 

TCP和UDP

TCP(傳輸控制協議)

面向鏈接的協議, 主要用於大量數據的場合,好比文件傳輸,一個TCP鏈接必需要通過3次握手才能創建

 

  1. 客戶端向服務器請求發送信號
  2. 服務器接收到後,向客戶端發送迴應信號,並提供seq序列號(表示每一個數據包的編號,由於數據是被拆成多個數據包發送的).告訴客戶端,你下個數據包序號從指定值開始
  3. 客戶端再次發出ACK肯定服務器的發送ACK請求同步要求

而後握手完成後,便開始進行數據傳輸了.

爲何要第3次握手,而不是2次握手?

避免重複鏈接請求,若是第一次鏈接請求超時了, 這時客戶端假如重發請求,而第一次鏈接請求最終仍是發送到服務器了,則服務器將再次重複接受到該請求,因爲服務器以前已經肯定過了第3次肯定請求,因此服務器能夠直接拋棄無論了(假如沒有第3次確認,則服務器沒法避免重連)

一個TCP斷連則須要4次揮手才能斷開

 

1.客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送

2.服務器收到這個FIN,它發回一個ACK,確認序號爲收到的seq序號加1。

3.服務器關閉與客戶端的鏈接,發送一個FIN給客戶端A

4.客戶端發回ACK報文確認,並將確認序號設置爲收到序號加1

UDP(用戶數據報協議)

無鏈接的協議, 主要用於不要求分組順序到達、少許數據的傳輸場合, 數據傳輸效率高.缺點容易掉包.

 

QT網絡編程

Qt Network模塊提供的類容許編寫 TCP/IP clients 和 servers、以及FTP和HTTP等經常使用協議(後續章節講解FTP和HTTP)

而QTcpSocket和QTcpServer類則是實現TCP客戶端和服務器用的.

QTcpSocket

在網絡編程中, QTcpSocket支持如下兩種訪問方式

1)異步(非阻塞)訪問

異步方式經過QTcpSocket的信號與槽實現,好比當咱們調用connectToHost()鏈接服務器時,此時並不是當即鏈接成功,因此咱們須要等待connected()信號觸發後,才知道鏈接成功,固然也能夠經過信號error()來處理與服務器的鏈接發生錯誤的異常事件.

2) 同步(阻塞)訪問

經過waitForXxxx()函數實現阻塞,最好使用多線程實現,不然的話,會致使界面也會進入阻塞.

QTcpSocket同步鏈接服務器步驟以下:

socket->connectToHost("192.168.1.101", 8088);         //鏈接服務器
if (socket->waitForConnected(1000))            //阻塞等待1000ms
      qDebug("Connected!");
else
      return false;
socket->write(data, len);                  //寫數據
socket ->waitForBytesWritten();

socket->waitForReadyRead();          //等待讀取數據
qDebug()<< "Received Bytes:" << socket->read(buf, sizeof(buf)-1);

socket ->disconnectFromHost();            //斷開鏈接
socket ->waitForDisconnected(); 

 

未完待續,下章來學習客戶端與服務器實例

相關文章
相關標籤/搜索