如何安全地分离数据包数据?

时间:2015-08-01 11:37:49

标签: java networking

我正在创建一个多人游戏,不知道如何分离数据包数据。

我的数据包结构如下(它是一个字符串):id(分隔符)内容

内容有时也有多个分隔符(在一个数据包中发送更多数据)

但是如果我的游戏有聊天(或任何其他用户输入),用户可以键入分隔符字符串并中断服务器。我该如何防止这种情况?

是否还有其他比PrintWriter更安全的方式将网络数据发送到套接字输出流?

1 个答案:

答案 0 :(得分:1)

有3个解决方案:

  1. 终止字符 - 字符串通常以文字0结尾(值为0的字节) - 这不是字符,因此您可以告诉字符串何时结束,因为它读取的内容为Alec0其中0是字面0而不是字母。因为它没有映射到一个字母,你知道它结束了字符串。你可以使用同样的东西
  2. 一个起始字符(不是一个好的解决方案)假设我们用0开始数据(这适用于流)然后您可以处理0msg0other,因为g必须是message的最后一个{1}}因为0启动了新的数据输入。然后流结束,所以最后一位必须是other
  3. 定义消息的协议(如游戏)最常见,它甚至有一个名称,https://en.wikipedia.org/wiki/Type-length-value - 类型长度值(编码)。
    基本上你说“前4个字节是一个表示消息类型的整数”,然后接下来的4个字节是有效负载的长度(值),例如:0x1 0x4 Alec表示
    • 消息类型:1
    • 长度:4
    • 数据:Alec