DataInputStream在Android中只接收2048字节的数据吗?

时间:2012-06-27 07:31:54

标签: c# java android .net datainputstream

从PC(服务器端),C#.Net应用程序必须通过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个字节?

    if(data_received&lt; = 2048字节) 上面的代码非常完美;

1 个答案:

答案 0 :(得分: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