1. 程式人生 > >QT網路程式設計:服務端和客戶端程式設計

QT網路程式設計:服務端和客戶端程式設計

QtNetwork中的QTcpSocket和QTcpServer類可用來編寫基於TCP的client和server

QTcpSocket提供client端的TCP功能,能夠發出TCP的請求至伺服器,其實它也是具有服務端傳送資料到客戶端的功能

QTcpServer則提供伺服器的功能,並接受TCP連線請求,以及指定port或IP位址

一、客戶端的請求與接收資料

基於Http的客戶端可以用QHttp來編寫。關於如何使用QHttp編寫客戶端請求和響應處理函式的例子很多,QHttp類也提供了多種請求方式,如get、post、head、request,下面是一個get方法傳送請求的例子:

HttpGet.h 

 

 這個HttpGet可以按照url地址進行Http請求,完成請求後會發出finished()的Signal,當QHttp所指定的全部請求完成時,會發出done()的Signal,HTTPGet類中自定義的Slot就是用來接收QHttp的done() Signal以進行相關處理的,這可以在HttpGet的實現中看到:

HttpGet.cpp

    HttpGet類實現了Http請求,並通過響應訊息的槽httpRequestFinished函式對接收到的資料流進行解析,實現網路通訊。

注意事項:

(1)書上和網上很多的例子都是直接根據url.path()來請求服務端的一個檔案,但是url.path()函式得到的字串不包含"?"及"?"號之後的字串,所以不能只用url.path(),而應該還要加上查詢字串QString requestPath = url.path() + queryString

譬如:

QString queryString("?a=china&b=dazhi");

QUrl url("http://localhost:8081/" + queryString); //建立URL地址

QHttp http;

http.setHost(url.host(), url.port());

(2)//注意:一定要將m_httpGetId 儲存,因為在通訊過程中,處理requestFinished訊息的槽會判斷m_httpGetId與當前狀態下requestId是否相等,只有在相等時,才能正確進行解析客戶端接收到的資料流,否則可能資料不完整。

二、服務端的響應與傳送資料

    使用QTcpServer進行了伺服器的建立,這裡就不多說了,例子很多,但是QT的文件裡和網上幾乎沒有關於如何使用QTcpSocket將資料傳輸到客戶端的例子,我在使用QTcpSocket進行資料傳送時,採用瞭如下方法:

譬如使用的QTcpSocket物件是tcpServerConnection,在響應請求訊息並進行處理後,將資料傳送到客戶端,可以使用:

    tcpServerConnection->write(ba),其中ba是要輸出到客戶端的位元組流QByteArray物件。

    有趣並折磨我很久的事情發生了!使用IE瀏覽器請求該伺服器時,能夠正確獲取並解析資料,但我使用QHttp編寫的客戶端程式卻死活也不能正確解析出接收到的位元組流資料,跟蹤後發現得到的資料流長度小於服務端的資料流長度,但為什麼IE瀏覽器能正常解析呢???

    後來終於發現QT的服務端的response預設情況下不包括response header資訊,而使用QHttp編寫的客戶端接收資料時又會預設認為接收到的資料包含了response header,導致它在解析資料流時,會把前面一部分資料作為header資訊,而後面的才為作為傳輸的資料,這樣解析出來資料流長度就會減少了,從而不能正確解析資料。因此我們需要在服務端傳送資料時輸出header資訊,再輸出我們所要傳輸的資料。

   下面是將影像資料流傳輸到客戶端的示例:

  

三、總結

    QT的例子程式不夠豐富全面,深度也不夠,甚至網路程式設計中服務端和客戶端的訊息模式都有區別,導致不知道內部機制的情況下,無法正確編寫程式,真希望QT在快速發展的同時能為我們開發人員提供更加全面的示例程式。

相關推薦

QtQt實現Winsock網路程式設計—TCP服務客戶通訊(多執行緒)

Qt實現Winsock網路程式設計—TCP服務端和客戶端通訊(多執行緒) 前言 感覺Winsock網路程式設計的api其實和Linux下網路程式設計的api非常像,其實和其他程式語言的網路程式設計都差不太多。博主用Qt實現的,當然不想用黑視窗唄,有介面可以看到,由於GUI程式設計

QT網路程式設計服務客戶程式設計

QtNetwork中的QTcpSocket和QTcpServer類可用來編寫基於TCP的client和server QTcpSocket提供client端的TCP功能,能夠發出TCP的請求至伺服器,其實它也是具有服務端傳送資料到客戶端的功能 QTcpServer則提供伺服器

java socket網路程式設計例項程式碼(含服務客戶

本程式碼為java socket網路程式設計例項程式碼,包括客戶端和服務端,實現客戶端傳送訊息,服務端接收並反饋訊息。 server.java為服務端程式碼。 client.java為客戶端程式碼。 服務端程式碼server.java: package socket;

MFC——socket程式設計(淺出+深度服務客戶埠問題)

要寫網路程式就必須用Socket,這是程式設計師都知道的。而且,面試的時候,我們也會問對方會不會Socket程式設計?一般來說,很多人都會說,Socket程式設計基本就是listen,accept以及send,write等幾個基本的操作。是的,就跟常見的檔案操作一樣,只要寫過就一定知道。 對於網路程式設計,

Socket系列(二)基於Socket網路通訊的服務客戶程式設計

        Socket系列一主要介紹了Socket的基礎知識、工作原理以及與傳統的http協議的區別。這部分內容的目的是為本文做鋪墊。本文將介紹基於Socket網路通訊的伺服器端和客戶端的程式設計。 一、伺服器端的程式設計         關於Socket伺服器端的

QTcpSocket-Qt使用Tcp通訊實現服務客戶

超過 amp 方式 all trac tro article ada 內部 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址: 本文標題:QTcpSocket-Qt使用Tcp通訊實現服務端和客戶端 本文地址:http:/

QUdpSocket-Qt使用Udp通訊實現服務客戶

array tle sig post 客戶端 種類型 可用 進行 += 版權聲明:若無來源註明,Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址: 本文標題:QUdpSocket-Qt使用Udp通訊實現服務端和客戶端 本文地址:http://t

從零開始學Socket(二)連線服務客戶

先了解一下執行緒問題,在Main函式裡就是主執行緒他能處理程式碼,而new Thread就是新開一個執行緒,他和主執行緒互不干預,但是主執行緒完了,他也完了。他完了,主執行緒沒事。   在上篇部落格裡,我們已經建立好了伺服器端和客戶端,但是他們倆還沒有聯絡,要把他們聯絡起來,就

從零開始學Socket(一)服務客戶建立

上篇我提到Socket是TCP/IP的抽象介面。所以我們直接使用就好,沒必要知其甚解。 1.開啟VS 新建專案 名稱,位置隨意 這裡名稱是Server 框架選.NET 4.5(在這篇部落格裡也無所謂) 注意引用 using System.Net; using

JAVA中Socket服務客戶網路通訊簡單案例

一. 簡單介紹下Socket的用途: 1.Java最初是作為網路程式語言出現的,其對網路提供了高度的支援,使得客戶端和伺服器的溝通變成了現實,而在網路程式設計中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相關的技術 2.IP地址+埠號組成了所

從零開始學Socket(三)服務客戶簡單通訊

連線上服務端和客戶端之後,我們就要讓他們互動起來了。(到了現在,大家如果對下面程式碼不懂得地方可以去F12跟蹤至原始碼介面檢視,學習就是這樣) 先在服務端編寫傳送函式和接收函式 /// <summary> /// 傳送資料到客戶

Socket程式設計服務客戶互相通訊,實現簡單的聊天

客戶端兩個執行緒分別記錄讀和寫,服務端兩個執行緒分別記錄讀和寫; 客戶端程式碼: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import

windows Socket程式設計之UDP的服務客戶

上一篇講了TCP的服務端和客戶端,本篇文章來介紹一下UDP的服務端和客戶端。 相比TCP來說,UDP相對比較簡單,剛開始的時候,和TCP一樣都需要先進行網路環境的初始化,即呼叫WSAStartup函式。然後呢,我們也需要建立一個socket,這個socket和TCP的那個s

Socket程式設計實現服務客戶的互動

用Socket實現網路程式設計首先要建立一個Socket物件,Socket類位於System.Net.Socket名稱空間,需要先行匯入。建立Socket物件需要以下三個引數,這些引數都是列舉型別: ①AddressFamily成員指定Socket用來解析地址的定址方案,

qt寫tcp服務客戶介面遇到的問題及解決方法

問題1 #include <QTcpSocket> #include <QtcpServer> 在包含這兩個標頭檔案時提示找不到檔案 此時需要在此工程的.pro檔案中新增 QT += network 問題2 服務端的ui介

在java網路程式設計中實現伺服器客戶一對一的聊天

如果有多個客戶端接入,都可以傳送訊息給伺服器,但伺服器只和最後一個客戶聊天。,如果要實現群聊的話,只要把所有的socket儲存到集合中,有客戶輸入時遍歷socket得到輸出流並把訊息廣播給各個客戶端就行了。 四個讀寫的執行緒類都是一樣的,可以進行封裝,這裡就不封裝了。 Se

Java網絡編程【Socket服務客戶

rgs .net aio highlight 如果 org author oid try Socket 編程大家都不陌生,Java 學習中必學的部分,也是 Java網絡編程核心內容之一。Java 網絡編程又包括 TCP、UDP,URL 等模塊。TCP 對應 Socket

Linux c實現一個tcp文件服務客戶

repr snippets 功能 stderr strcpy fprintf inet_addr 編寫 create 總體需求:編寫tcp文件服務器和客戶端。客戶端可以上傳和下載文件。 ===========================================

python3實現TCP協議的簡單服務客戶

由於 轉載 while encoding ont ans 令行 cti 數據 利用python3來實現TCP協議,和UDP類似。UDP應用於及時通信,而TCP協議用來傳送文件、命令等操作,因為這些數據不允許丟失,否則會造成文件錯誤或命令混亂。下面代碼就是模擬客戶端通過命令行

python3實現UDP協議的簡單服務客戶

開始 turn lose () rec 交流 cnblogs 無連接 簡單的 利用python中的socket模塊中的來實現UDP協議,這裏寫一個簡單的服務器和客戶端。為了說明網絡編程中UDP的應用,這裏就不寫圖形化了,在兩臺電腦上分別打開UDP的客戶端和服務端就可以了。