4

我不太喜欢位和字节,所以如果这个问题很愚蠢,我很抱歉。

我对套接字有一些经验,通常用于传输少量纯文本。但是,这一次我必须传输更多可以通过 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

虽然这对我有用,但名称等仍然存在一些安全风险。我很难告诉客户包含“[|]”的显示名称是非法的。

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

任何有关加密的额外信息将不胜感激!

4

2 回答 2

5

考虑使用 Google 协议缓冲区。您定义一条消息(在 .proto 文件中),它会为您生成不同编程语言的代码。

然后生成的代码能够对您的消息进行编码/解码,而无需您考虑数据是如何编码的。

编码的消息将非常小,并且编码/解码速度非常快。协议缓冲区非常擅长这一点。

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

于 2012-07-12T11:25:24.443 回答
1

如果您的目标是最小化传输数据,您总是可以尝试不太复杂的压缩算法(我们不想花费大量时间压缩和解压缩每个数据包)。你可以看看这个问题或搜索一个外部库,比如这个

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

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

于 2012-07-12T11:29:40.127 回答