2012-07-12 67 views
4

我沒有太多的位和字節,所以我很抱歉,如果這個問題很愚蠢。通過UDP傳輸數據最小化的最有效方法是什麼?

我有一些插座的經驗,通常用於傳輸少量的純文本。但是這一次我必須傳輸更多的數據,我可以通過UDP分解。

我正在開發一個遊戲,其中服務器是用Java編寫的,我想向客戶端發送一個對象數組。由於我是一個web開發人員,JSON是傳輸數據時彈出的第一個東西,但我非常懷疑這是網絡中最有效的方式。

在JSON的情況下:

{ 
    "players": [ 
     { 
      "id": "884B0EAA2C7F16BA", // hex string 
      "name": "some guy",   // string 
      "x": 0,      // double 
      "y": 0,      // double 
      "xv": 0,     // double 
      "yv": 0,     // double 
      "angle": 0,     // double 
     }, { 
      "id": "AB61F7C2AAE0B488", // hex string 
      "name": "some other guy", // string 
      "x": 0,      // double 
      "y": 0,      // double 
      "xv": 0,     // double 
      "yv": 0,     // double 
      "angle": 0,     // double 
     } 
    ] 
} 

現在,我可以添加自定義的分隔符來分割每個球員和另一個分隔符分割的數據。在我的光學中,最有效的方法之一是將每行播放器的值放入,並在這些值之間放置預定義的字符序列。

884B0EAA2C7F16BA[|]some guy[|]0[|]0[|]0[|]0[|]0 
AB61F7C2AAE0B488[|]some other guy[|]0[|]0[|]0[|]0[|]0 

雖然這對我很有用,但名稱等仍有一些安全隱患。我很難告訴客戶,包含「[|]」的顯示名稱是非法的。

什麼是儘量減少傳輸數據的最有效的方法是什麼?

有關加密任何其他資料將不勝感激!

+2

「加密」 deoesn't最小化數據,*壓縮*數據最小化 - 你可以看看類似的gzip壓縮類(GZIPInput /輸出中流)? – Nim 2012-07-12 11:24:49

回答

5

考慮使用Google協議緩衝區。您可以定義一條消息(位於.proto文件中),並以不同的編程語言爲您生成代碼。

生成的代碼然後能夠編碼/沒有任何需要你想想如何將數據進行解碼,您的郵件。

的編碼消息將是非常小的,並且非常快的編碼/解碼。協議緩衝區真的很擅長。

有關於它的一些好的文檔網站:https://developers.google.com/protocol-buffers/

+0

我會研究這個。聽起來很有趣!Google使用他們所有令人驚歎的工具和API來保持令人驚歎的效果 – 2012-07-12 11:40:38

+0

我也應該考慮Apache Thrift提供相同的東西。看到這個比較http://blog.octo.com/serialisation-thrift-et-protocol-buffers/ – Pith 2012-10-02 12:00:58

1

如果你的目標是儘量減少傳輸數據時,你總是可以嘗試壓縮算法,該算法不是太複雜(我們不想花大量的時間壓縮和解壓縮每個數據包)。 您可以看看this question或搜索外部庫,如this one

除非你能肯定知道數據的每個字段的長度,則必須使用某種分隔符。在玩家名字中避免使用某些角色幾乎用在每個遊戲中,爲什麼你不能這樣做?

如果你仍然希望允許玩家名稱中的任何字符,通過一個TCP套接字將它們全部發送出去,然後在每個客戶端用ID-Player名稱構建一個表格,並使用服務器給出的唯一ID你的UDP句子。這樣,您可以安全地使用分隔符。

相關問題