最小化通过UDP传输数据的最有效方法是什么?

时间:2012-07-12 11:16:43

标签: java sockets encryption udp

我没有太多的位和字节,所以如果这个问题很愚蠢我会道歉。

我对套接字有一些经验,通常用于传输少量纯文本。但是这次我必须传输更多我可以通过UDP分解的数据。

我正在开发一个游戏,其中服务器是用Java编写的,我想将一组对象发送到客户端。由于我是一名网络开发人员,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 个答案:

答案 0 :(得分:5)

考虑使用Google Protocol Buffer。您定义了一条消息(在.proto文件中),它以不同的编程语言为您生成代码。

生成的代码能够编码/解码您的消息,而无需您考虑数据的编码方式。

编码的消息非常小,编码/解码速度非常快。协议缓冲区真的很擅长。

网站上有一些很好的文档:https://developers.google.com/protocol-buffers/

答案 1 :(得分:1)

如果您的目标是最小化传输数据,您可以尝试使用不太复杂的压缩算法(我们不想花费大量时间压缩和解压缩每个数据包)。 您可以查看this question或搜索外部库,例如this one

除非您确定每个数据字段的长度,否则必须使用某种分隔符。避免在玩家名称中使用某些角色几乎在每场比赛中使用,为什么你不能这样做?

如果您仍想在播放器名称中允许任何字符,请通过TCP套接字将所有字符一起发送,并在每个客户端中使用ID-Player名称对构建一个表,并使用服务器中给出的唯一ID UDP句子。这样,您就可以安全地使用分隔符。