QT tcp Socket 通訊開發

2021-05-23 03:22:58 字數 1481 閱讀 9000

折騰了很久tcp ip通訊機制。

以前雖然看過bsd tcp/ip的so called 基礎通訊**。什麼bind, listen ,accept , receive, write, read,但是一直沒真正理解。

這次由於公司需求,我狠狠地讀了**,並且搬出qt老本行,開始了qt for windows的程式設計。

這個大體構架是做乙個聊天室軟體。

每個client都可以給伺服器tcp發訊息,伺服器通過tcp給各個客戶端**訊息。

伺服器端**:

server.cpp   繼承 qtcpserver  主要用來listen to some port , 偵聽到埠後, 繼承重寫了incomingconnection函式,來new 如下的乙個

**tcpclientsocket.cpp 這個繼承qtcpsocket ,用來 server.cpp裡被 new 出來,接受各種請求

它重寫了函式datareceived , 即各種客戶端發來的請求資料,(注意,這個不是第一步的connect狀態,這個是業務邏輯上得請求,比如我給

server傳送了「你好」 ) 。

這一步處理好後,便開始給各個客戶端分發同樣的訊息「你好」 。使用方法,很簡單,qtcpsocket的write方法即可。

這裡的細節重點是,在server.cpp裡,每個new出來的tcpclientsocket的指標,我放到乙個qlist< tcpclientsocket * >模板裡。這樣,只要

你不刪去這個節點,這個tcp鏈結就一直存在,嘿嘿,神奇吧。

剛開始我看qt自帶example ,fortuneclient and threaded fortune server;我試圖著在example的基礎上修改**,一步步達到目的。結果

發現他的業務邏輯,總是write後就自動disconnected, 我以為不disconnected,就能長鏈結,結果總是出錯。

我一直納悶,這是為什麼呢?我用了個list儲存了socket的descriptor,以為留著套接字的描述符,就可以下次再調出來用用。實際呢,必須

建立鏈路的時刻,就儲存指標。tcp鏈結,指標在,鏈路在。指標亡,鏈路亡。

對方的訊號,這個電子,一路走過去,直到accept , 這乙個鏈路建立了,在網絡卡開闢了區域了,在系統os也開闢了記憶體,兩方都為此一直保持

著這段資料的存在,指標即維繫乙個網路tcp鏈路的關鍵。

這就意味著,客戶端無需寫什麼偵聽**來接受伺服器端的訊息,直接保持那個鏈路,訊息自然就可以發過來,觸發datareceived訊號。

寫完**後,我測試了一下,3個客戶端同時鏈結tcp伺服器端的5566埠,全部成功。

曾經很糾結我的所謂埠只能被乙個占用。看來,理論遠不如實際來的直接。

最後,我還是貼個**吧。我知道,當乙個人尋找各類訊息的時候,**總是最先看得,誰喜歡看人家部落格嘮叨半天,不講大道理啊!

伺服器端:

iOS開發通訊知識

互動 通訊 過程 客戶端向伺服器發起請求,伺服器接收到請求之後,向客戶端作出相應.請求 客戶端向伺服器索要資料 相應 伺服器向客戶端返回資料 構建請求步驟 1.明確url,建立url,nsurl 2.建立請求 nsurlrequest 3.建立請求連線,發起請求 nsurlconnection 同步...

Android 後台開發通訊

public class mainactivity extends public void loginget view view public void loginpost view view get請求執行緒 runnable getrun newrunnable post請求執行緒 runnab...

iOS近場通訊 藍芽開發,WiFi開發

1 airdrop uiactivityviewcontroller類 功能 實現ios裝置間的檔案和資料分享。airdrop使用藍芽來掃瞄周圍的裝置,當兩台裝置通過藍芽建立起了連線,考慮到更快速的資料傳輸,它就會建立點對點的wifi網路來連線兩部ios 裝置。但並不意味著為了使用airdrop而需...