我們正在編寫的在線多人遊戲中閃存願望淨服務器端,我們需要雙工信道,從而通信使用套接字完成。服務器 - C#,客戶端 - 閃存,數據交換協議
你能告訴我關於在服務器和客戶端之間交換數據的協議/格式的一些最佳實踐嗎? 海事組織的好選擇之一可能是使用JSON序列化。
我們正在編寫的在線多人遊戲中閃存願望淨服務器端,我們需要雙工信道,從而通信使用套接字完成。服務器 - C#,客戶端 - 閃存,數據交換協議
你能告訴我關於在服務器和客戶端之間交換數據的協議/格式的一些最佳實踐嗎? 海事組織的好選擇之一可能是使用JSON序列化。
這取決於。暫時忘掉涉及的技術,並專注於您的特定通信需求。希望你不介意我是否也探索一些相關的觀點。
如果你的代碼需要任何形式的同步內容,那麼你可能需要在你的代碼的答覆流量控制,以及一些消息傳遞結構排序消息具有ID,並可能有一個原始消息ID,他們是答覆。這將幫助您控制即使在異步協議上的內容。在這種情況下,像JSON這樣的易於維護的協議可能會更好,因爲提到了@JustLogin。
全雙工意味着您將在網絡/解釋器層上存儲更多數據,並且可能需要處理異步通信。
如果性能是一個問題,並根據您的具體情況,那麼像@Viacheslav所提出的建議可能會很有吸引力。定製協議可以大大優化,但需要犧牲可維護性和可移植性(幾種語言都有自己的JSON解釋器,而自定義解釋器可能需要實現或封裝,爲過程添加層,從而降低性能或需要進行代碼轉換。 )
如果你不關心一個或兩個數據包是否丟失,那麼UDP可能是一個可行的解決方案。比TCP更少的控制意味着更輕的協議,但是除非實施自己的控制,否則您無法確定數據是否到達了另一端。
TL; DR版本:我會堅持使用像JSON這樣的標準低級協議,即使它們會增加一些開銷。
我認爲,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將簡化數據庫和其他所有內容之間的數據通信。
好的解決方案是專有協議,因爲它會提供完美的性能和流量優化。
我們已經嘗試過不同的協議來爲我們的在線撲克搜索最好的一個。
的研究的結果是下一個協議:
頭兩個字節是一個封裝類型。 包的後兩個字節是包的大小。 N字節封裝體