【问题标题】:Java: Why does my String get corrupted over UDP?Java:为什么我的字符串在 UDP 上被破坏了?
【发布时间】:2015-04-21 02:04:22
【问题描述】:

我正在发送一个只有一个字符串作为内容的 UDP 数据报,我正在创建这样的数据包:

String content = ALIVE + "," + clusterName + "," + nodeName + "," + location;
byte[] data = content.getBytes();
packet = new DatagramPacket(data, data.length);

问题是,当它到达时,最后有一些奇怪的二进制数据,不能显示为字符(在 Sublime Text 中它只显示几个 NUL 符号)。

String data = new String(packet.getData());

我使用字符串 tokenizer(,) 提取不同的信息部分,现在通过在发送之前添加另一个 , 解决了这个问题。我还是想知道,这些数据是从哪里来的?

【问题讨论】:

标签: java string udp


【解决方案1】:

请仔细注意建议您在两端明确指定字符编码的答案。他们的建议非常好。

但是,如果字符数据被准确接收,但最后添加了一些垃圾,那么您的问题不太可能是由字符编码不匹配引起的。更有可能是因为接收者错误地使用了DatagramPacket。

DatagramPacket 为消息提供一个固定长度的缓冲区,getData() 方法返回该缓冲区。如果它比最近收到的消息长,那么尾端将包含与该消息无关的数据。收到消息后,必须使用数据包的getLength()方法来确定缓冲区中有多少字节对应于消息。

【讨论】:

  • 谢谢,这很好用。 (String data = new String(packet.getData(), 0, packet.getLength());)
【解决方案2】:

永远不要调用String.getBytes() 或只使用byte[] 的构造函数。

始终在两边传递明确的字符集。

由于您当前编写的代码,发送者可以生成一种编码的字节,而阅读者可以(错误地)将它们解释为其他编码,从而产生各种类型的垃圾。

您可能还有其他问题。

【讨论】:

  • 好建议,但它没有回答问题。
  • 哦?您确定 OP 没有因字符集不匹配而导致数据损坏吗?
  • 不,我不确定(尽管从描述中我觉得这很可疑)。你也不是。不过,编辑改进了答案。
  • 编码不是问题(尽管将来可能是一个问题),但我想在两边指定字符集总是更好。感谢您的提示。
【解决方案3】:

您在一端从字符转换为字节,在另一端从字节转换为字符。一切都很好,但是您没有指定使用的字符编码,如果这些不匹配,字节/字符转换将不正常工作。

你有两个选择:

  1. 使用适当的字符集指定转换
  2. 使用容易混淆的-Dfile.encoding JVM 参数强制使用JVM 使用的默认 编码。

我更喜欢第一个选项,因为您可能无法控制代码的执行方式或位置(例如,如果您的代码被提升到库中以供其他地方使用)

【讨论】:

    【解决方案4】:

    你可以像这样明确指定字符集:

    byte[] data = content.getBytes(StandardCharsets.UTF_8);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多