Qt客戶服務端傳輸數據總結

第一個小項目是關於Qt多線程與網絡傳輸的。
環境:VS2015+QT5.3(或者任意的其他版本的VS+QT組合)
要求:分別編寫一個客戶端和服務器端的程序,程序A作爲客戶端,程序B作爲服務器端,具體要求如下(期限3到5天時間):
a)程序B需要每隔1秒向程序A不停的傳送報文1,報文2和報文3三種報文,用多線程的方式實現三種報文的發送。報文采用結構體進行定義(包括報文頭,報文數據,報文尾三部分),報文數據也用結構體的形式進行定義。
b)程序A的界面需要三個元素:
1)可以進行服務器端IP和端口號配置的輸入框;
2)需要對程序B發過來的報文內容進行顯示(只需要顯示報文數據內容,不需要顯示報文頭和尾);
3)需要一個列表用來對不同類型的報文的個數進行統計,列表列名包括報文名字和報文個數(報文個數需要實時統計)。
c)通迅部分採用的通訊機制,不做強制要求,以實現爲目的;其他部分需要採用QT實現。
這個題目我的思路是:
首先解決服務端的數據發送問題:
初始化網絡環境–>初始化套接字–>等待客戶端連接–>接入套接–>初始化三個線程並把套接字傳入–>發送數據
客戶端接收數據:
初始化網絡環境–>初始化套接字–>連接服務器–>獲取套接字數據存入緩存池–>刷新界面數據

期間遇到的疑惑:

線程間共享數據?
線程間貢獻一個數據,好像只要不是new出來的,可以共享。幾個共享線程間發送數據,共享一個套接字,把數據作爲線程類初始化參數傳過去。

Qt的自定義信號是怎麼做的?
寫一個函數,定義觸發條件,滿足觸發條件了就emit發送信號。

如何通過套接字傳輸結構體?
內存打包。把內存中的內容通過memcpy拷貝到一個字符數組當中。接收之後用一個通用結構體存起來,再通過數據報頭解析數據報。我發送的三種報文的大小是一樣的,如果大小不一樣呢?關於內存對其的規律。

Qt中的多線程開啓方式?
線程類繼承QThread,重寫Run函數。
據說還有一種辦法,尚未驗證,線程類繼承自QObject類,利用movetoThread方法改變線程所屬到一個繼承自QThread類的類的對象中。

盲點:
關於Qt的網絡套接字用法?規避了這個問題,採用了Windows系統提供的套接字
關於QByteArray
關於Qt的流

改進的地方:
把通訊模塊獨立設計出來

發佈了36 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章