2012-07-12 70 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句子。这样,您可以安全地使用分隔符。

相关问题