小弟剛轉做后臺,現在有個問題想請教下各位大神!
客戶端與服務器之間正常雙向他通信,假如就是基于socket的tcp,,如果我們的模式是:客戶端在每一次send之后如果都需要獲取服務器的回應,另外客戶端也可以接收服務器的主動推送訊息。
這樣的情況,大家一般是怎么處理的?是在訊息頭上封裝一個標識,這個標識是針對每一次請求的回應嗎?需要創建單獨的socket,來接收主動推送呢?
uj5u.com熱心網友回復:
UPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPUPuj5u.com熱心網友回復:
考慮使用TIdCmdTCPServer、TIdCmdTCPClientuj5u.com熱心網友回復:
基于什么原因呢?
uj5u.com熱心網友回復:
這個只是比較方便命令/回應型別的應用,用一般TCP Client/Server也一樣做。uj5u.com熱心網友回復:
要定義好服客間的對話協議格式。uj5u.com熱心網友回復:
這個行嗎?
我客戶端既要接收主推的訊息,也要接收請求回應的訊息。
那么接收主推肯定是要單獨的執行緒或者異步來做,接收請求回應的訊息要用同步來做,如果不開多個socket的話,怎么實作多執行緒來同時操作同一個socket的資料呢。。。
比方說我們定義了協議格式,主推執行緒判斷不是主推的,但是這時候接收請求回應執行緒已經沒有辦法recv到這個資料了啊
uj5u.com熱心網友回復:
比如服務器回應的訊息,是發送一個字串“serverResponse”,主動推送的訊息,是發送一個字串“serverPush”。客戶端用一個執行緒同樣接收處理就是了,比如收到“serverResponse”,發送“readyForServerResponse”,服務器收到就發送具體的資料,客戶端接收資料。
客戶端收到“serverPush”也是類似,反正就是一來一去發送接收,都是用自定義的一個字串作為先導。
個人覺得比較麻煩的是,假如連接中斷、恢復連接的時候,怎樣從中斷的流程恢復。或者重新連接的時候,從頭開始一個流程,像第一次連接時一樣。
uj5u.com熱心網友回復:
如果收到一個先導字串,接下來馬上接收資料的話,對方發送先導字串時可以把要發送資料的長度資訊編碼進去。這里有一個問題,就是在一個發送、接收流程未處理完的時候,客戶端有新的操作請求,簡單一點處理這個請求命令字串可以放在佇列里延遲發送,直到一個流程結束才發送。
我考慮的這個比較簡單,實用的應該比較復雜,其實可以參考一下木馬的源代碼,了解一下它的流程處理。
uj5u.com熱心網友回復:
TCP協議吧,可考慮使用Indy控制元件。當然如果采用UDP也可以,就是自己多處理一點,發現發出訊息,沒有應答,那就再發訊息即可,直到有應答。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/49186.html
標籤:網絡及通訊開發
