2013-06-16 1 views
0

Я разрабатываю приложение для Android, чтобы отправить файл через bluetooth на java-сервер, используя BlueCove library version 2.1.0 на основе this snippet. В начале все выглядит нормально, но файл не будет передан полностью. Только около 7 КБ 35 КБ.Файл не переведен полностью (Android)

Android

private void sendFileViaBluetooth(byte[] data){ 
    OutputStream outStream = null; 
    BluetoothDevice device = btAdapter.getRemoteDevice(address); 
    btSocket = device.createRfcommSocketToServiceRecord(MY_UUID); 
    btSocket.connect(); 
    try { 
     outStream = btSocket.getOutputStream(); 
     outStream.write(data); 
     outStream.write("end of file".getBytes()); 
     outStream.flush(); 
    } catch (IOException e) { 
    } finally{ 
      try { 
      outStream.close(); 
      btSocket.close(); 
      device = null; 
    } catch (IOException e) { 
    } 
    } 
} 

PC сервер

InputStream inStream = connection.openInputStream(); 

byte[] buffer = new byte[1024]; 

File f = new File("d:\\temp.jpg"); 
FileOutputStream fos = new FileOutputStream (f); 

InputStream bis = new BufferedInputStream(inStream); 

int bytes = 0; 
boolean eof = false; 

while (!eof) { 
    bytes = bis.read(buffer); 
    if (bytes > 0){ 
     int offset = bytes - 11; 
     byte[] eofByte = new byte[11]; 
     eofByte = Arrays.copyOfRange(buffer, offset, bytes); 
     String message = new String(eofByte, 0, 11); 

     if(message.equals("end of file")) { 
      eof = true; 
     } else { 
      fos.write (buffer, 0, bytes); 
     } 
    } 
} 

fos.close(); 
connection.close(); 

Я уже пробовал разбить массив байтов, прежде чем писать:

public static byte[][] divideArray(byte[] source, int chunksize) { 
    byte[][] ret = new byte[(int)Math.ceil(source.length/(double)chunksize)][chunksize]; 

    int start = 0; 

    for(int i = 0; i < ret.length; i++) { 
     ret[i] = Arrays.copyOfRange(source,start, start + chunksize); 
     start += chunksize ; 
    } 

    return ret; 
} 

private void sendFileViaBluetooth(byte[] data){ 

    [...] 

    byte[][] chunks = divideArray(data, 1024); 

    for (int i = 0; i < (int)Math.ceil(data.length/1024.0); i += 1) { 
     outStream.write(chunks[i][1024]); 
    } 

    outStream.write("end of file".getBytes()); 
    outStream.flush(); 

    [...] 

} 

Каждая помощь или идеи приветствуются.

ответ

2

Вам это не нужно. Канонический способ копирования потока в Java:

while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 
out.close(); 

То же самое на обоих концах. TCP/IP сделает все для вас. Все, что вам нужно сделать, это правильно справиться с разным размером чтения, что и в этом коде.

+0

Но тогда файл также не будет полностью передан. Действительно ли TCP используется для передачи данных по Bluetooth SPP? – TomBoo

 Смежные вопросы

  • Нет связанных вопросов^_^