gpt4 book ai didi

java - 使用输出流发送文件长度并使用输入流接收长度和字节 [] 以将帧从一个设备流式传输到另一个 Android/Java

转载 作者:行者123 更新时间:2023-11-30 03:14:53 26 4
gpt4 key购买 nike

我搜索了又搜索,发现的所有内容都很有帮助,但我总是遇到内存不足错误。我发送的图像是 .06 MB,所以我知道问题不在于将 byte[] 解码为位图。当我删除 while 循环时,这对一帧来说就像一个魅力,但我想要多帧。我得到一个 byte[] 并使用套接字将它发送到不同的设备,但我不知道如何做到这一点。我的问题是我没有发送和接收正确的 byte[] 长度。这就是我目前正在做的事情。

while (count != -1) {

//first send the byte[] length
dataOutputStream.writeInt(sendPackage.length);

//pass a byte array
publishProgress("sending file to client");
showMyToastOnUiThread(String.valueOf(sendPackage.length));
outputStream.write(sendPackage, 0, sendPackage.length);
outputStream.flush();
}

在不同的设备上接收byte[]:

int count = inputStream.read();
while (count != -1) {
int byteArrayLength = dataInputStream.readInt();
Log.i(MainActivity.TAG, "Starting convert to byte array");

byte[] receivedBytes = convertInputStreamToByteArray(inputStream, byteArrayLength);

Bitmap bitmap = BitmapFactory.decodeByteArray(receivedBytes, 0, receivedBytes.length);
publishProgress(bitmap);
}

//convert inputstream to byte[]
public byte[] convertInputStreamToByteArray(InputStream inputStream, int readLength) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] data = new byte[readLength];
try {

Log.i(MainActivity.TAG, "Starting convert to byte array while loop");
int readTotal = 0;
int count = 0;

while (count >= 0 && readTotal < readLength) {
count = inputStream.read(data, readTotal, readLength - readTotal);
if (readLength > 0) {
readTotal += count;
}
}

Log.i(MainActivity.TAG, "Finished convert to byte array while loop");

} catch (IOException e) {
Log.e(MainActivity.TAG, "error: " + e.getMessage());
e.printStackTrace();
}
return data;
}

最佳答案

问题是:

int count = inputStream.read();
while (count != -1) {

您正在消耗一个字节然后忽略它。这意味着您读取的下一个值(大小)将不正确。您需要一种不同的方式来判断您是否处于流的末尾。一些选项:

  • 完成后发送-1;这样你就可以在 readInt 返回 -1
  • 时立即停止
  • 如果您知道,请在开始发送之前发送您要发送的图像数量
  • 使用 mark(1),然后是 read(),然后是 reset() - 如果您的流支持标记。不知道会不会。如果没有,您总是可以将其包装在 BufferedInputStream 中。
  • 自己重新实现 DataInputStream.readInt,将流的结尾检测为预期的可能性,而不是抛出异常
  • 只需在 readInt 中捕获异常(不太好 - 到达流的末尾并不是真正的异常)

关于java - 使用输出流发送文件长度并使用输入流接收长度和字节 [] 以将帧从一个设备流式传输到另一个 Android/Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20301459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com