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

标签 java networking

我正在创建一个多人游戏,但不确定应该如何分离数据包数据。

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

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

但是如果我的游戏有聊天(或任何其他用户输入),用户可以输入分隔符字符串并破坏服务器。我怎样才能防止这种情况发生?

除了 PrintWriter 之外,还有其他更安全的方式将网络数据发送到套接字输出流吗?

最佳答案

有3种解决方案:

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

关于java - 如何安全地分离数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31761384/

相关文章:

java - 内部类的访问修饰符

java - byte[] 数组在输入 SQLiteDatabase 之前和之后有所不同

android - 如何通过 shell 命令启用 Android 网络共享?

c# - TcpListener 和 TcpClient 共享本地端口

java - 如何检查客户端是否在Java中是本地的

java - Camel 分离器 : Add individual headers based on body

Java 编程 - 当我需要字符时,我的用户名显示整数。为什么?

linux - wifi数据包捕获有什么限制?

networking - 远程获取公网IP

performance - 推还是拉近乎实时的自动化服务器?