【问题标题】:DataOutputStream.writeBytes adds zero-bytesDataOutputStream.writeBytes 添加零字节
【发布时间】: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[] 并将相应的数值打印到控制台来检查它。
  • 不应该给你这些零字节,我倾向于认为有一些你没有发布的代码会以某种方式导致问题。但我有一个建议可以尝试:不要使用writeBytesreadLine,而是使用writeUTFreadUTF。这些方法正确地处理了字符编码,但更重要的是,它们在字符串前面加上写入字符串所需的字节数,而读者使用它来只读取写入的字节数。
  • 将什么转换为字符?字符串已经是字符。您从哪里获得此转换的字节数?

标签: java tcp


【解决方案1】:

我只是要把它扔出去。您正在使用在 Java 5、6 和 7 中已弃用的 readLine() 方法。API 文档非常清楚地表明该方法“不能正确地将字节转换为字符”。我会将其读取为字节或使用缓冲阅读器。

http://docs.oracle.com/javase/1.5.0/docs/api/java/io/DataInputStream.html#readLine%28%29

【讨论】:

    【解决方案2】:

    writeBytes() 不会添加额外的字节。

    您编写的代码无效,因为您没有编写换行符。因此它不起作用,并在 readLine() 中永远阻塞。

    在尝试调试时,您似乎以其他方式读取了字节,可能是使用 read();并忽略 read 返回的返回值,并得出结论 read() 填充了您提供的缓冲区,而实际上它没有填充,留下三个字节处于初始状态,即零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2016-07-24
      • 2011-03-08
      • 1970-01-01
      相关资源
      最近更新 更多