【问题标题】:How to get true byte order with BufferedInputStream.read()?如何使用 BufferedInputStream.read() 获得真正的字节顺序?
【发布时间】:2017-01-21 16:34:10
【问题描述】:

服务器根据以下内容向我发送一个 int:

DataOutputStream stdOut = new DataOutputStream(myServerSocket.getOutputStream());
stdOut.writeInt(1);
stdOut.flush();

我尝试从我的客户那里读取它:

BufferedInputStream dIn = new BufferedInputStream(myClientSocket.getInputStream());
byte[] reception        = new byte[4]; // writeInt() writes 4 bytes
int status              = -1;

status = dIn.read(reception, 0, 4); 
// status = 1
// (int) reception = 0

我正在等待 4 个字节来计算发送的 Int。 但是,它只接收 1 个字节并处理它而不等待剩余的字节。 因为我等待4个字节,所以我尝试了这个:

int count = 0;
while(count < 4) {
    status = dIn.read(reception);
    count += status;
    System.out.println("Read: " + count);
}*/

我看到它先是 1 个字节,然后是 3 个字节。

  • 最终,当我打印 HEX 结果时,我得到:00 00 01 00。
  • 似乎是这样发送的(按顺序):00 00 00 01
  • 并分两部分接收:00,然后是 00 00 01
  • 其存储方式如下:00 00 01 00。

这就是为什么我没有得到我的 int 1。

  1. 如果不等待 4,read(bytes, 0, 4) 的目的是什么 字节?
  2. 如何按真实顺序简单地获取我的 4 个字节?

注意:当客户端使用 DataInputStream 时,readInt() 可以正常工作...

【问题讨论】:

  • 我不确定我是否理解您的问题。如果 DataInputStream 具有您需要的行为,请使用它。
  • 1. 4 指定要传输的最大字节数,正如它在 Javadoc 中明确指出的那样。 2. 你的读取循环有一个错误,readInt() 没有。不清楚您为什么不使用有效的代码,并且与发件人是对称的。
  • 我在这个论坛上读到 BufferedInput/OutputStream 更快。我想尝试比较一下。

标签: java datainputstream bufferedinputstream


【解决方案1】:

使用DataInputStream 及其readInt() 方法。

DataInputStream dIn = new DataInputStream(new BufferedInputStream(myClientSocket.getInputStream()));
int status = dIn.readInt();

【讨论】:

  • 谢谢,它似乎工作!其实我也不知道用什么语法,我用的是没有DataStream的BufferedStream...
猜你喜欢
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 2022-07-31
相关资源
最近更新 更多