客戶端發出
newdataFromClient來切斷服務器開始處理新資料:
socket.on('newdataFromClient', async(newdataFromClient) => {
let result = await doSomething(newdataFromClient)
socket.emit('response', result)
})
- 當服務器未完成處理時,客戶端發送更多資料
服務器最終會發出 2 個結果并將它們發送回客戶端。每newdataFromClient收到一份。
結果會按順序發回,還是先發回較快完成的結果?
我在 Macbook Pro 上運行基本節點服務器。如果服務器開始newdataFromClient一個接一個地獲取多個,它是否會開始在單獨的執行緒上處理每個執行緒,并且當執行緒用完時,它將開始按順序堆疊它們?
我認為如果我的服務器無法處理太多呼叫,無論如何它都會崩潰,但這是一個單獨的問題。
在這里,我只對服務器回應的順序感興趣。
uj5u.com熱心網友回復:
socket.io 事件將按照它們從服務器發送的順序到達。這里的底層傳輸是 TCP,它使資料包保持有序。
現在,如果服務器本身正在處理單個到達的請求,并且在處理發送結果的程序中,它具有異步操作,則服務器可能無法保證它將發送回應的順序。事實上,服務器上的完成順序很可能是不可預測的。
結果會按順序發回,還是先發回較快完成的結果?
無論哪一個先在服務器上完成并發送回訊息,都會是客戶端最先收到的那個。這些是獨立的訊息,只要它們在服務器上發出,它們就會在傳輸途中到達客戶端。而作為 socket.io 引擎基礎的 webSocket 協議基礎的 TCP 傳輸將按照它們最初從服務器發送的順序保存這些資料包。
socket.io 中的確認功能
socket.io 確實有一種從特定訊息中獲取特定“確認”的方法。如果您查看socket.emit() doc,您將看到可選引數之一是 ack 回呼。可以使用(與服務器發送 ack 回應結合)來獲得對該特定訊息的特定回應。有關如何實作的詳細資訊,請參閱該“ack”功能的客戶端和服務器端檔案。
如果不使用該內置功能,您將必須構建自己的基于 messageID 的系統,以便您可以將從服務器回傳的給定回應與原始請求匹配(這就是“ack”功能在內部所做的),因為 socket.io 是本身不是請求/回應協議(它是訊息協議)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/344605.html
