从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);
我对以下内容感到困惑:
或者,即使设备收到所有字节,dataInputStream
是否只显示2048个字节?
if(data_received&lt; = 2048字节) 上面的代码非常完美;
答案 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
。