2012-03-17 140 views
8

我在通过蓝牙套接字发送大文件时遇到问题。较小的文件得到正确传输。我相信高达161280字节得到正确传输。蓝牙文件传输Android

编辑:我做了一些更多的测试,并缩小了原因。看来,

outStream.write(mybytearray, 0, mybytearray.length); 

在发送代码部分是写不超过161280字节。我通过不关闭套接字连接来看到这种行为,从而导致接收部分中的read在161280字节上“阻塞”。这里的蓝牙输出流有什么问题?我究竟做错了什么?

编辑2: 这样做可以让它通过。

for(int i = 0 ; i < mybytearray.length ; i++){ 
    outStream.write(mybytearray[i]); 
} 

发送代码:

try { 
     outStream = mBluetoothSocket.getOutputStream(); 
     Log.d(TAG,"outStream created success!"); 
    } catch (IOException e) { 
     Log.d(TAG, 
       "ON RESUME: Output stream creation failed.", 
       e); 
    } 

    File myFile = new File(file_name); 
    Log.d(TAG,"file /source.pdf created success!"); 

    byte[] mybytearray = new byte[(int)myFile.length()]; 
    Log.d(TAG,"file length() =" + (int)myFile.length()); 

    FileInputStream fis = new FileInputStream(myFile); 
    Log.d(TAG,"fis created"); 

    BufferedInputStream bis = new BufferedInputStream(fis,1272254); 
    Log.d(TAG,"bis created success"); 

    bis.read(mybytearray,0,mybytearray.length); 
    Log.d(TAG,"ALL Bytes read from bis"); 

    outStream.write(mybytearray, 0, mybytearray.length); 
    Log.d(TAG,"BYTES WRITTEN to OUTSTREAM of socket"); 


    outStream.flush(); 
    Log.d(TAG,"bytes flushed"); 
    outStream.close(); 

接收代码:

// Attach the i/p stream to the socket 
    try { 
     InputStream in = socket.getInputStream(); 
     mIn = in; 
     Log.d(TAG, "input stream acquired"); 

    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    // Create output streams & write to file 
    FileOutputStream fos = new FileOutputStream(
      Environment.getExternalStorageDirectory() 
        + "/copy.pdf"); 
    try { 
     bytesRead = mIn.read(buffer, 0, buffer.length); 
     Log.d(TAG, "bytesRead first time =" + bytesRead); 
     current = bytesRead; 

     do { 
      Log.d(TAG, "do-while -- current: " + current); 
      bytesRead = mIn.read(buffer, current, 
        buffer.length - current); 
      Log.d(TAG, "bytesRead: =" + bytesRead); 

      if (bytesRead >= 0) 
       current += bytesRead; 
     } while (bytesRead > -1); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.d(TAG, "do while end:-- buffer len= " 
       + buffer.length + " current: " + current); 

     fos.write(buffer); 
     Log.d(TAG, "fos.write success! buffer: " 
       + buffer.length + " current: " + current); 

     fos.flush(); 
     fos.close(); 
    } 
} 
socket.close(); 

logcat的:

D/ReceiveService(5761): do-while -- current: 155232 
D/ReceiveService(5761): bytesRead: =1008 
D/ReceiveService(5761): do-while -- current: 156240 
D/ReceiveService(5761): bytesRead: =1008 
D/ReceiveService(5761): do-while -- current: 157248 
D/ReceiveService(5761): bytesRead: =1008 
D/ReceiveService(5761): do-while -- current: 158256 
D/ReceiveService(5761): bytesRead: =1008 
D/ReceiveService(5761): do-while -- current: 159264 
D/ReceiveService(5761): bytesRead: =1008 
D/ReceiveService(5761): do-while -- current: 160272 
D/ReceiveService(5761): bytesRead: =1008 
D/ReceiveService(5761): do-while -- current: 161280 
W/System.err(5761): java.io.IOException: Software caused connection abort 
W/System.err(5761): at android.bluetooth.BluetoothSocket.readNative(Native Method) 
W/System.err(5761): at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:307) 
W/System.err(5761): at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96) 
W/System.err(5761): at com.bt.server.ReceiveService$AcceptThread.run(ReceiveService.java:141) 

我正在使用摩托罗拉Milestone。 Android 2.1

+0

粘贴发送设备的日志,包括时间戳。希望发送和接收正在一个单独的线程上完成。 – 2012-03-17 07:56:17

+0

在“软件引起的连接中止”中找到SO。 – 2012-03-17 08:00:57

+0

是的,他们在不同的线程。不同的手机。发送设备几乎是瞬间发送数据。 – shiraz 2012-03-17 08:06:48

回答

2

我能够通过向蓝牙输出发送小块数据来解决这个问题。事实证明,8 * 1024是一个很好的缓冲区大小,这有助于在数据流中无缝发送数据,并防止接收端数据损坏。

BufferedInputStream bis = new BufferedInputStream(fis, 8 * 1024); 


byte[] buffer = new byte[8192]; 
int len 
while ((len = bis.read(buffer)) != -1) { 
    outStream.write(buffer, 0, len); 
} 
+1

我在使用蓝牙聊天示例通过蓝牙发送简单图像文件时遇到问题。其实,我的要求是发送任何文件或蓝牙。为此,我如何设置缓冲区大小,如何接收小块数据并在接收端进行组合。可以请你分享我的代码。 – 2013-01-02 15:29:25

+0

你可以看看这个http://stackoverflow.com/questions/16954082/send-text-file-using-bluetooth-sockets-in-android – neerajDorle 2013-06-06 05:29:24

+0

我正在开发一个基于你的方法的解决方案,但我卡在outStream.write(mybytearray,0,mybytearray.length);它不会将数据写入输出流。没有错误,创建的文件大小为0字节,日志在bis.read(mybytearray,0,mybytearray.length)之后立即停止。有任何想法吗? – 2016-11-21 23:58:12