2011-11-17 108 views
31

我對構建一個小型的實時多人遊戲感興趣,使用HTML5/JavaScript作爲客戶端,可能使用Java作爲服務器軟件。WebSockets適合實時多人遊戲嗎?

我看了一下WebSockets,但看起來我對WebSockets實際上有些誤解。我最初認爲WebSockets只是JavaScript處理TCP套接字的方式,就像在Java和其他語言中使用一樣,但看起來整個握手過程必須發生,並且每次傳輸都包含很多HTTP開銷(並且在那種情況下,對Ajax的好處似乎並不像第一眼那樣令人興奮)?

關於相關主題,有沒有更好的替代WebSockets用於此目的(JavaScript中的實時多人遊戲)?

+2

實際上每個傳輸只包含兩個字節的開銷。 http握手只發生在打開新的websocket時,並且只要瀏覽器停留在該頁面上,您就可以保持websocket處於打開狀態。 –

+1

是的,他們是。 HTTP握手完成一次以打開套接字。所以如果你在一封郵件後關閉套接字,開銷會很大,如果你永遠保持套接字打開,那麼開銷就不大。 – Raynos

+0

爲什麼握手過程如此複雜?從我記得的,我們必須讀一些字符串,其中最後一個字符是[隨機]字符集合,然後必須以某種方式對base64進行編碼併發送回客戶端。我試圖自己編寫所說的服務器端握手代碼,但它不起作用(握手過程從未完成,所以我永遠無法發送和檢索自己的數據包)。當使用其他人編寫的Java程序包來做同樣的事情時,我達到了同樣的結果。 – Josh1billion

回答

32

WebSockets是在網絡瀏覽器中運行的實時多人遊戲的最佳解決方案。正如在註釋中指出的那樣,初始握手的地方是HTTP連接升級,但一旦建立連接,WebSockets爲服務器和客戶端之間的雙向通信提供最低延遲連接機制。

我建議你看這個:https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.be

看一看:

唯一的原料TCP的解決辦法是使用支持某種TCPClient對象的插件。我建議你嘗試一下WebSockets。

您可以找到多個選項here。只需在頁面內搜索WebSockets即可。

也看看WebRTC。根據遊戲的目的以及是否需要服務器來管理遊戲狀態,您可以使用此技術進行點對點通信。您可能仍然需要一個解決方案來處理玩家分組 - 在這種情況下,WebSockets是最快/最好的解決方案。

+2

羅布霍克斯視頻的鏈接被破壞,這是同樣的談話嗎? http://youtu.be/_t28OPQlZK4 –

+2

@JasonSperske - 是的,謝謝。我也更新了這些例子。 – leggetter

7

多人遊戲需要服務器向客戶端發送世界狀態的定期快照。在瀏覽器HTML/js應用程序的上下文中,您沒有什麼選擇:輪詢,websocket或編寫自己的插件來擴展瀏覽器功能。

諸如BOSHBayeux的HTTP輪詢非常複雜,但會引入網絡開銷和延遲。 websocket的設計是爲了克服它們的侷限性,而且肯定會更有反應。

庫(例如cometdsocket io)提供傳輸的抽象併爲您解決瀏覽器兼容性問題。最重要的是,它允許在底層傳輸之間進行切換,並且可以毫不費力地比較其性能。

我編碼multiplayer arcade game與socket.io和通常措施2ms延遲與websocket和約30ms與xhr輪詢在局域網上。這對多人遊戲來說已經足夠了。

我建議你看看nodejs和socket。io爲了能夠在客戶端和服務器之間共享代碼,您還可以在[3]上借用一些多人遊戲代碼。

0

如果您打算爲您的遊戲使用JavaScript,那麼WebSocket是您的最佳選擇。如果你想支持舊版本的Internet Explorer,那麼請考慮微軟開發的Signal R系統。他們正在使用WebSocket,但他們也有一些回退選項......所以協議將使用可用的最佳可用解決方案。

http://signalr.net/

+2

Socket.io也有倒退 – JorgeGarza

6

我不知道,如果WebSockets的仍然是網絡 實時多人,這些天(2017年)的最佳工具。 WebRTC是一種較新的技術 ,它提供了更高性能的潛力。而這些 天的WebRTC也更容易與感謝合作,以下庫:

另外,如果你想獨善其身包裝你的遊戲,這是一個很好的匹配實現網絡實現的實際細節,並且您正在尋找一個提供更高級別多人遊戲界面的庫,請看Lance.gg。 (免責聲明:我是貢獻者之一)。

+0

如果我們需要一個權威的服務器,爲了防止玩家作弊,WebRTC工作嗎?我們如何防止使用WebRTC作弊? – trusktr

+0

而且,它似乎發送二進制數據將是最快的。人們正在使用WebSockets序列化JSON。這不是很慢嗎?我們如何才能在網絡上建立一個權威的UDP網絡? – trusktr

0

基本上,你有3個選擇在寫這篇文章的時間:

的WebSockets

的WebSockets是一個輕量級的消息傳遞協議,它利用TCP,而不是一個Javascript實現TCP套接字的,因爲你」已經指出。但是,除了最初的握手之外,還沒有HTTP標頭在該點之後傳遞。連接建立後,數據可以自由通過,開銷很小。

長輪詢

長輪詢,概括地說,定期涉及到客戶端輪詢新的信息的服務器的HTTP請求。這在CPU和帶寬方面非常昂貴,因爲您每次發送大量新的HTTP標頭。這對於舊瀏覽器來說實質上是您唯一的選擇,而像Socket.io這樣的庫在這些情況下使用長輪詢作爲後備。

的WebRTC

除了什麼已經被提及,的WebRTC允許通過UDP通信。由於UDP開銷低(相對於TCP),低延遲和非阻塞性質,UDP在非網絡環境中一直用於多人遊戲。

TCP「保證」每個數據包將到達(除了災難性的網絡故障),並且他們將始終以發送的順序到達。這對於重要信息(如註冊樂譜,點擊,聊天等)非常有用。

另一方面,UDP沒有這樣的保證。數據包可以以任何順序到達,或根本不會。當涉及以較高頻率發送並且需要儘快到達的較不重要的數據時,這實際上是有用的,例如播放器位置或輸入。原因在於如果在傳輸期間單個數據包延遲,TCP流將被阻止,從而導致遊戲狀態更新中的較大差距。使用UDP,您可以簡單地忽略延遲到達(或根本不到)的數據包,並繼續下一次收到的數據包,爲玩家創造更流暢的體驗。

在撰寫本文時,WebSocket可能是您最好的選擇,儘管WebRTC的採用正在迅速擴大,並且在您完成遊戲時可能更可取,所以這是需要考慮的問題。