在Android Gingerbread上通过蓝牙传输大量数据

eth*_*han 5 android bluetooth

我试图从一个Android手机一次转移大约一兆字节的任意数据.目前,我把大小,命令代码和数据写到一个DataOutputStream周围BufferedOutputStream,OutputStream返回来自bluetoothSocketInstance.getOutputStream().

接收电话读取大小和命令代码,然后从输入流中读取,直到它获得了预期的所有数据.这适用于短字符串,但对于较大的文件,并非所有数据都会传输.在调试器中运行应用程序显示写入返回没有任何异常,读取读取预期的一小部分字节,然后无限期地阻塞.它也没有任何例外.

某个地方是否有缓冲填满?我还需要做些什么来确保所有数据都被传输吗?

我的发件人和收件人代码如下:

发件人:

  try {

            DataOutputStream d = new DataOutputStream(new BufferedOutputStream(mmOutStream,buffer.length+8));
            //int b= buffer.length;
            d.writeInt(buffer.length);
            d.writeInt(command);

            d.write(buffer);
            d.flush();

        } catch (IOException e) {
            Log.e(TAG, "Exception during write", e);
        }
    }
Run Code Online (Sandbox Code Playgroud)

接收器:

 try {

                // Read from the InputStream
                int messageSize= inStream.readInt();
                int messageCode = inStream.readInt();
                bytes=0;
                buffer =new byte[messageSize];
                while(bytes < messageSize)
                {
                    bytes += inStream.read(buffer,bytes,messageSize - bytes);

                }
                    message = bytes;
            } catch (IOException e) {
                Log.e(TAG, "disconnected", e);
                connectionLost();
                break;
            }
Run Code Online (Sandbox Code Playgroud)

eth*_*han 3

经过更多测试后,我将发送代码更改为如下所示:

for(int i=0; i<buffer.length;i+=BIG_NUM)
            {
                int b = ((i+BIG_NUM) < buffer.length) ? BIG_NUM: buffer.length - i;
                d.write(buffer,i,b);
                d.flush();
            }
Run Code Online (Sandbox Code Playgroud)

文件现在已发送。有人知道为什么吗?flush()在数据实际传输之前调用是否会阻塞?是否有任何有关发送和接收缓冲区大小的文档可以帮助我确定可以安全地设置多大的缓冲区BIG_NUM