基本上,你有3個選擇在寫這篇文章的時間:
的WebSockets
的WebSockets是一個輕量級的消息傳遞協議,它利用TCP,而不是一個Javascript實現TCP套接字的,因爲你」已經指出。但是,除了最初的握手之外,還沒有HTTP標頭在該點之後傳遞。連接建立後,數據可以自由通過,開銷很小。
長輪詢
長輪詢,概括地說,定期涉及到客戶端輪詢新的信息的服務器的HTTP請求。這在CPU和帶寬方面非常昂貴,因爲您每次發送大量新的HTTP標頭。這對於舊瀏覽器來說實質上是您唯一的選擇,而像Socket.io這樣的庫在這些情況下使用長輪詢作爲後備。
的WebRTC
除了什麼已經被提及,的WebRTC允許通過UDP通信。由於UDP開銷低(相對於TCP),低延遲和非阻塞性質,UDP在非網絡環境中一直用於多人遊戲。
TCP「保證」每個數據包將到達(除了災難性的網絡故障),並且他們將始終以發送的順序到達。這對於重要信息(如註冊樂譜,點擊,聊天等)非常有用。
另一方面,UDP沒有這樣的保證。數據包可以以任何順序到達,或根本不會。當涉及以較高頻率發送並且需要儘快到達的較不重要的數據時,這實際上是有用的,例如播放器位置或輸入。原因在於如果在傳輸期間單個數據包延遲,TCP流將被阻止,從而導致遊戲狀態更新中的較大差距。使用UDP,您可以簡單地忽略延遲到達(或根本不到)的數據包,並繼續下一次收到的數據包,爲玩家創造更流暢的體驗。
在撰寫本文時,WebSocket可能是您最好的選擇,儘管WebRTC的採用正在迅速擴大,並且在您完成遊戲時可能更可取,所以這是需要考慮的問題。
實際上每個傳輸只包含兩個字節的開銷。 http握手只發生在打開新的websocket時,並且只要瀏覽器停留在該頁面上,您就可以保持websocket處於打開狀態。 –
是的,他們是。 HTTP握手完成一次以打開套接字。所以如果你在一封郵件後關閉套接字,開銷會很大,如果你永遠保持套接字打開,那麼開銷就不大。 – Raynos
爲什麼握手過程如此複雜?從我記得的,我們必須讀一些字符串,其中最後一個字符是[隨機]字符集合,然後必須以某種方式對base64進行編碼併發送回客戶端。我試圖自己編寫所說的服務器端握手代碼,但它不起作用(握手過程從未完成,所以我永遠無法發送和檢索自己的數據包)。當使用其他人編寫的Java程序包來做同樣的事情時,我達到了同樣的結果。 – Josh1billion