天天看點

記錄:WEBAPI與Socket連接配接如何對應一個請求與響應

有三個終端,浏覽器、伺服器、裝置。

浏覽器與伺服器采用Http通信,伺服器與裝置采用Socket通信。

發送請求資料的順序:

浏覽器==》伺服器==》裝置

發送響應資料的順序:

浏覽器《==伺服器《==裝置

浏覽器和伺服器不多說,用ajax就行。主要是伺服器與裝置之間的soket通信。

由于Socket連接配接是異步多線程而且是全雙工,雙方可以互相發消息,伺服器無法知道裝置到底是什麼時候回複,回複對應的請求又是哪一個,怎麼辦呢?

很簡單

浏覽器請求 WebAPI的時候,設定有逾時時間,比如說3秒逾時。(如果3秒之内你不給我資料,我就認為沒有資料傳回)。

在Socket這一端呢,我向Socket發送WebAPI的請求資料。我給WebAPI的請求資料加一個編号,我當然不知道Socket啥時候給我傳回資料,是以開了一個異步的線程,隻要Socket有傳回資料。我就把傳回資料存到緩存裡(以請求編号為鍵,緩存資料,這樣就可以找到是哪一次請求的資料了,緩存預設30秒過期)。

然後WebAPI請求就在主等待傳回資料,肯定不能無限期地等待下去,這裡有個請求循環,每個循環 之間延遲100毫秒,最多5次循環。在每次循環中,WebAPI請求都是在緩存中找資料,根據請求編号找對應的傳回資料,如果找到請求傳回的資料,就直接傳回。沒找到就循環繼續找,直到5次循環結束,還沒有找到就認為找不到這條資料。

發送的資料帶上編号,比如Guid

然後在監聽資料傳回的回調裡,把這個編号設為鍵,傳回的資料設為值,存放到記憶體中(比如CaChe)。

是以WEBAPI主線程發送Socket資料完之後就可以用循環去記憶體取了。取到了就可以傳回浏覽器了,沒取到表示裝置沒發送過來,就傳回錯誤資訊。