0

从 PC(服务器端)C#.Net 应用程序必须通过 Wi-Fi 将 22000 字节的数据发送到 Android 设备(客户端)。但dataInputStream在 Android 设备中仅显示 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 字节?

    If (data_received <= 2048 bytes) 以上代码完美运行;

4

1 回答 1

5

你基本上不应该使用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另请注意,据我所知,这里没有必要使用。

于 2012-06-27T07:35:16.960 回答