2015-04-20 61 views
1

我发送一个UDP数据报只有一个字符串的内容和我创建的包是这样的:Java:为什么我的字符串通过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()); 

我提取不同的信息部分与字符串标记(,)和发送之前刚刚加入另一个,在年底,现在解决了这个问题。不过,我想知道,这些数据来自哪里?

+0

可能与此有关? HTTP://计算器。com/questions/8229064 /如何摆脱空的剩余缓冲区 – Ravi

回答

1

仔细听取答案,建议您在两端都明确指定字符编码。他们的建议非常好。

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

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

+0

谢谢,这工作完美。 (String data = new String(packet.getData(),0,packet.getLength());) –

1

从来没有,请致电String.getBytes()或只需要byte[]的构造函数。

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

由于您的代码是当前编写的,发件人可以生成一个编码的字节,读者可以(错误地)将它们解释为某种其他编码,从而生成各种风格的垃圾。

您可能还有其他问题。

+0

好的建议,但它没有回答这个问题。 –

+0

噢?你确定OP没有遭受来自不匹配字符集的数据损坏吗? – bmargulies

+0

不,我不确定(虽然我觉得从描述中可疑)。你也不是。不过,编辑改进了答案。 –

1

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

你有两个选择:

  1. 与适当的字符指定的转换设置
  2. 强制使用容易混淆的命名-Dfile.encoding JVM参数JVM所使用的默认编码

我宁愿第一个选项,因为您可能没有在你的代码是如何执行的,或者(例如,如果你的代码被提升到一个库中的其他地方使用)

1

您可以指定角色控制这样明确设置:

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