【发布时间】:2014-03-18 00:10:33
【问题描述】:
我有一个小的 TCP 服务器程序和一个相应的客户端,它们通过 ServerSocket 和 Socket 类以及 DataInputStream/DataOutputStream 进行通信。我在向服务器发送字符串时遇到问题。
connection = new Socket("localhost", 2233);
outStream = new DataOutputStream(connection.getOutputStream());
outStream.writeBytes(fileName);
fileName 目前是一个硬编码字符串,其值为“listener.jardesc”。服务器读取字符串,代码如下:
inStream = new DataInputStream(connection.getInputStream());
String fileName = inStream.readLine();
字符串被正确接收,但末尾添加了三个零值字节。为什么会这样,我怎样才能阻止它发生? (当然,我可以修剪接收到的字符串或以其他方式阻止这个问题的重要性,但我宁愿完全阻止这个问题)
【问题讨论】:
-
什么版本的Java?该 readLine() 方法在 Java 5、6 和 7 中已弃用。docs.oracle.com/javase/7/docs/api/java/io/…
-
为什么你认为使用
writeBytes之后可以使用readLine?你写"listener.jardesc\n"了吗?以及如何得出最后三个零字节的结论,如何检查您的值? -
Java 7。不,只是“listener.jardesc”。我通过将其转换为 char[] 并将相应的数值打印到控制台来检查它。
-
它不应该给你这些零字节,我倾向于认为有一些你没有发布的代码会以某种方式导致问题。但我有一个建议可以尝试:不要使用
writeBytes和readLine,而是使用writeUTF和readUTF。这些方法正确地处理了字符编码,但更重要的是,它们在字符串前面加上写入字符串所需的字节数,而读者使用它来只读取写入的字节数。 -
将什么转换为字符?字符串已经是字符。您从哪里获得此转换的字节数?