我正在创建一个多人游戏,但不确定应该如何分离数据包数据。
我的数据包结构如下所示(它是一个字符串):id(分隔符)内容
内容有时也有多个分隔符(以在一个数据包中发送更多数据)
但是如果我的游戏有聊天(或任何其他用户输入),用户可以输入分隔符字符串并破坏服务器。我怎样才能防止这种情况发生?
除了 PrintWriter 之外,还有其他更安全的方式将网络数据发送到套接字输出流吗?
最佳答案
有3种解决方案:
- 终止字符 - 字符串通常以文字
0
(值为 0 的字节)结尾 - 这不是一个字符,因此您可以知道字符串何时结束,因为它读取为例如Alec0
其中0
是文字0
而不是字母。因为它没有映射到字母,所以您知道它结束了字符串。你可以使用同样的东西 - 起始字符(不是一个好的解决方案)假设我们以
0
开始数据(这适用于流),那么您可以将0msg0other
处理为g
必须是message
的最后一个,因为0
开始一个新的传入数据位。然后流结束,因此最后一位必须是other
- 最常见的定义消息的协议(protocol)(如游戏)非常常见,甚至有一个名称:https://en.wikipedia.org/wiki/Type-length-value - 输入长度值(编码)。
基本上,您说“前 4 个字节是表示消息类型的整数”,然后接下来的 4 个字节是有效负载(值)的长度,例如:0x1
0x4
Alec
表示- 消息类型:1
- 长度:4
- 数据:
亚历克
关于java - 如何安全地分离数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31761384/