2013-04-28 125 views
5

我們正在編寫的在線多人遊戲中閃存願望服務器端,我們需要雙工信道,從而通信使用套接字完成。服務器 - C#,客戶端 - 閃存,數據交換協議

你能告訴我關於在服務器和客戶端之間交換數據的協議/格式的一些最佳實踐嗎? 海事組織的好選擇之一可能是使用JSON序列化。

回答

3

這取決於。暫時忘掉涉及的技術,並專注於您的特定通信需求。希望你不介意我是否也探索一些相關的觀點。

  • 點至點(P2P)流:我們知道這一個 - 雙工,你所說的。
  • p2p模式:半雙工或全雙工?數據會同時交換,還是始終是消息響應機制?
  • 狀態:即使交換的主要部分是異步的,也可能有代碼等待響應。交易所絕對是異步的嗎?同步?混合使用嗎?這一點與前一個密切相關。
  • 傳輸:數據突發或恆定流?
  • 帶寬:您預計會有多少字節/秒的流量?是否有相當比例的目標網絡(無線?移動?高速?)
  • 可靠/不可靠內容:數據包丟失是否會導致您的客戶端狀態處於混亂狀態? (這不是壞事本身,只是一個規範。)

如果你的代碼需要任何形式的同步內容,那麼你可能需要在你的代碼的答覆流量控制,以及一些消息傳遞結構排序消息具有ID,並可能有一個原始消息ID,他們是答覆。這將幫助您控制即使在異步協議上的內容。在這種情況下,像JSON這樣的易於維護的協議可能會更好,因爲提到了@JustLogin

全雙工意味着您將在網絡/解釋器層上存儲更多數據,並且可能需要處理異步通信。

如果性能是一個問題,並根據您的具體情況,那麼像@Viacheslav所提出的建議可能會很有吸引力。定製協議可以大大優化,但需要犧牲可維護性和可移植性(幾種語言都有自己的JSON解釋器,而自定義解釋器可能需要實現或封裝,爲過程添加層,從而降低性能或需要進行代碼轉換。 )

如果你不關心一個或兩個數據包是否丟失,那麼UDP可能是一個可行的解決方案。比TCP更少的控制意味着更輕的協議,但是除非實施自己的控制,否則您無法確定數據是否到達了另一端。

TL; DR版本:我會堅持使用像JSON這樣的標準低級協議,即使它們會增加一些開銷。

3

我認爲,JSON可以是最好的選擇,讓我解釋一下爲什麼。

首先,JSON序列化的遊戲流量是相加的,因爲JSON符號就像「name:val」,不像"<name> val </name>"。其次,JSON序列化是遊戲中最直觀的一種。 XML和類似XML的符號對多行數據很有用,但遊戲中變量的值通常很短(HP,法力值,AP值,損壞等),並且可以用一行描述。第三,Actionscript 3(我希望你不會在AS2中編寫MMO)爲JSON解碼/編碼提供了完美的工具。 XML解析工具也很好,但IMO,JSON更好。另外,在Flash 11+中,JSON操作非常優化。第四,許多高負載項目在MongoDB中使用緩存服務器,它的主要格式是BSON(二進制JSON),因此在這種情況下使用JSON將簡化數據庫和其他所有內容之間的數據通信。

3

好的解決方案是專有協議,因爲它會提供完美的性能和流量優化。

我們已經嘗試過不同的協議來爲我們的在線撲克搜索最好的一個。

的研究的結果是下一個協議:

頭兩個字節是一個封裝類型。 包的後兩個字節是包的大小。 N字節封裝體

  1. 加載套接字中的前4個字節以獲取封裝的大小和類型。
  2. 負載封裝主體
  3. 發送封裝主體來處理對消息類型處理器
相關問題