ServerSocket同时不会中断图像数据输入流

兰普拉萨德

我试图使用蓝牙将图像从一个设备发送到另一设备,为此我使用了Android蓝牙聊天应用程序源代码,并且在发送String时工作正常,但是如果我将图像作为字节数组发送,则while循环不会中断或EOF不会从Inputstream读取时达到。

型号:1

它正确接收图像。但是这里我需要传递resultByteArray length。但是我不知道长度。如何知道inputstream中字节数组的长度?inputstream.available()返回0。

while(true)
{
    byte[] resultByteArray = new byte[150827];
    DataInputStream dataInputStream = new DataInputStream(mmInStream);
    dataInputStream.readFully(resultByteArray);

    mHandler.obtainMessage(AppConstants.MESSAGE_READ, dataInputStream.available(),-1, resultByteArray).sendToTarget();
}

型号:2

在这段代码中,循环不中断,

ByteArrayOutputStream bao = new ByteArrayOutputStream();

byte[] resultByteArray = new byte[1024];

int bytesRead;
while ((bytesRead = mmInStream.read(resultByteArray)) != -1) {
    Log.i("BTTest1", "bytesRead=>"+bytesRead);
    bao.write(resultByteArray,0,bytesRead);
}

final byte[] data = bao.toByteArray();

也尝试过,byte[] resultByteArray = IOUtils.toByteArray(mmInStream);但也没有用。我关注了蓝牙聊天示例

如何解决这个问题?

纽基姆

如评论中所述,服务器需要将图像长度放在实际图像数据的前面。图像长度信息的长度应固定为4个字节。

然后在while循环中,您需要先获取4个字节来确定图像的长度。之后,从输入流中读取确切长度的字节。那是实际的图像。

在连接处于活动状态时,while循环不需要中断。实际上,它需要在同一while循环中等待另一个图像数据。InputStream.read()是一个阻断功能和线程将被睡眠,直到它从输入流中接收到足够的数据。

然后,您可以在紧接前一个图像数据之后再等待4个字节,作为另一个图像的开始。

while(true) {
    try {
        // Get the length first
        byte[] bytesLengthOfImage = new byte[4];
        mmInStream.read(bytesLengthOfImage);
        int lengthOfImage = 0;
        {
            ByteBuffer buffer = ByteBuffer.wrap(bytesLengthOfImage);
            buffer.order(ByteOrder.BIG_ENDIAN);  // Assume it is network byte order.
            lengthOfImage = buffer.getInt();
        }

        byte[] actualImage = new byte[lengthOfImage];   // Mind the memory allocation.
        mmInStream.read(actualImage);

        mHandler.obtainMessage(AppConstants.MESSAGE_READ, lengthOfImage,-1, actualImage).sendToTarget();
    } catch (Exception e) {
        if(e instanceof IOException) {
            // If the connection is closed, break the loop.
            break;
        }
        else {
            // Handle errors
            break;
        }
    }
}

这是一种简化的通信协议。有一个易于协议实现的开源框架,称为NFCommunicator。

https://github.com/Neofect/NFCommunicator

对于一个简单的项目而言,这可能是过分规范的,但值得一看。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在输入中插入图标而不会中断

来自分类Dev

读取用户输入而不会中断bash

来自分类Dev

虽然循环不会中断?

来自分类Dev

Symfony:清除缓存而不会中断服务

来自分类Dev

WPF:实现ICommandSource而不会中断IsEnabled

来自分类Dev

Break语句不会中断循环

来自分类Dev

Break语句不会中断for循环

来自分类Dev

Python return语句不会中断循环

来自分类Dev

Vue制定了计算属性,不会中断

来自分类Dev

Symfony:清除缓存而不会中断服务

来自分类Dev

Java while循环不会中断

来自分类Dev

进入图形模式而不会中断汇编

来自分类Dev

Powershell功能不会中断

来自分类Dev

Ruby-循环不会中断

来自分类Dev

循环不会中断。C程序

来自分类Dev

fgets()while循环不会中断

来自分类Dev

Java bufferedReader readline 循环不会中断

来自分类Dev

Python while 循环不会中断

来自分类Dev

MySQL删除大量行并重新插入新数据而不会中断

来自分类Dev

MySQL删除大量行并重新插入新数据而不会中断

来自分类Dev

添加表单输入会中断表单

来自分类Dev

即时修改输入流数据

来自分类Dev

PHP + jQuery-使用数据库数据进行长时间轮询无法正常工作(不会中断循环)

来自分类Dev

PHP + jQuery-使用数据库数据进行长时间轮询无法正常工作(不会中断循环)

来自分类Dev

使用HttpPost批注?修复,使其不会中断页面

来自分类Dev

以下哪项不会中断正在运行的进程?

来自分类Dev

Autopep8不会中断较长的注释行吗?

来自分类Dev

在列中插入文本而不会中断间距

来自分类Dev

即使条件为true,Return语句也不会中断