【问题标题】:Does DataInputStream receives only 2048 bytes of data in Android?Android中DataInputStream是否只接收2048字节的数据?
【发布时间】:2012-06-27 07:31:53
【问题描述】:

C#.Net 应用程序必须从 PC(服务器端)通过 Wi-Fi 向 Android 设备(客户端)发送 22000 字节的数据。但 Android 设备中的 dataInputStream 仅显示 2048 字节。

dataInputStream = new DataInputStream(workerSocket.getInputStream());
byte[] rvdMsgByte = new byte[dataInputStream.available()];
for (int i = 0; i < rvdMsgByte.length; i++)
    rvdMsgByte[i] = dataInputStream.readByte();
String rvdMsgStr = new String(rvdMsgByte);

我对以下内容感到困惑:

  1. PC只能发送2048字节的数据吗?
  2. 或者,Android 设备是否只有 2048 字节的容量来接收数据?
  3. 或者,即使设备接收到所有字节,dataInputStream 是否也仅显示 2048 个字节?

    如果(data_received

【问题讨论】:

  • 可能是 dataInputStream.available() 作为公共方法 available() 的限制“返回估计的字节数,可以在不阻塞的情况下读取或跳过更多输入。”根据developer.android.com/reference/java/io/InputStream.html。如果需要,尝试将字节数组的大小设置为 22000,看看它是否有效...
  • @herom 我先做了同样的事情。我将字节大小设置为 30000,但它显示 EOFException。 :)
  • 我明白了 ;) @Jon Skeet 解释得很好,很高兴听到它有效 :)

标签: c# java android .net datainputstream


【解决方案1】:

您基本上不应该使用InputStream.available()。这告诉您现在有多少可用数据 - 如果它仍然通过网络传输,这可能不是全部信息。

如果流将在消息末尾结束,您应该简单地继续循环,一次读取一个块,直到您完成(最好不要一次只读取一个字节! )。例如:

byte[] readFully(InputStream input) throws IOException {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    byte[] buffer = new byte[8 * 1024]; // 8K buffer
    int bytesRead;
    while ((bytesRead = input.read(buffer)) > 0) {
        output.write(buffer, 0, bytesRead);
    }
    return output.toByteArray();
}

如果您需要将流分解为消息,您应该考虑如何做到这一点 - 在数据之前发送“消息长度”前缀通常是最佳选择。

一旦你阅读了所有的数据,你应该这样做:

String rvdMsgStr = new String(rvdMsgByte);

这将使用平台默认编码将字节转换为文本。如果这是真正的文本数据,您应该使用字符串构造函数重载,它可以让您明确指定编码。

如果它不是真正的文本数据,你不应该试图这样对待它。如果确实需要将其表示为字符串,请使用 base64。

另外请注意,据我所知,这里不需要使用DataInputStream

【讨论】:

  • 对此非常好的解释!非常感谢(即使我不是线程所有者);)
  • 我很困惑,这是关于 java 还是 .net-C#?我看到这两个标签,看起来 OP 在询问 C# 而您回答的是 Java。
  • @gdoron:客户端是Java,服务器是C#。
  • 正如@herom 所说,这是一个很好的解释,它解决了我的问题。感谢 JonSkeet,快速回复。 :) 还有 gdoron,什么是 OP?
  • 但我还是想知道,有没有办法用接收到的实际数据长度而不是固定数字来声明byte[] buffer
猜你喜欢
  • 2019-06-02
  • 2021-12-28
  • 2022-08-17
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2014-08-26
相关资源
最近更新 更多