Передача файлов в Android по WiFi с использованием TCP вызывает сбой приложения, если размер файла слишком велик - PullRequest
1 голос
/ 23 марта 2012

Я пытался перенести музыкальный файл с одного телефона Android на другой, запустив серверное приложение на одном телефоне для отправки файла и клиентское приложение на другом для получения файла. Я открыл сокет TCP, чтобы установить соединение и передать байты. Тем не менее, когда я увеличиваю размер файла, сервер продолжает отправлять файлы, когда клиент все еще блокирует во время приема. Это приводит к отсутствию фрагментов данных до тех пор, пока приложение не завершится сбоем. Я попытался распределить отправляющее действие, спя нить потока после каждой отправки, чтобы приемный буфер не переполнялся, но думаю, что это расточительный подход. Кто-нибудь может предложить лучший способ координировать между отправкой и получением таким образом, чтобы надежно отправлять mp3-файл размером около 5 Мб?

Спасибо, Swetha

    private BufferedInputStream in = null;
    private BufferedOutputStream output = null;
    ReceiveBytes str2;
    private FileOutputStream out3;
    private Socket clientsocket;

    try 
      { 
      clientsocket= new Socket("192.168.1.70",9864);
      }
    catch(ActivityNotFoundException e) 
      {
     Log.e(TAG, e.getMessage());            
      } 
    catch(Exception e) 
      {
      Log.e(TAG, e.getMessage());           
      }

    try 
      {
      out3= new FileOutputStream(path,true);
      } 
    catch (FileNotFoundException e) 
      {
       Log.e(TAG, e.getMessage());              
      }

    try
         {
             in = new BufferedInputStream(clientsocket.getInputStream());
             output = new BufferedOutputStream(out3);
             str2 = new ReceiveBytes(clientsocket,out3);
             str2.copyfile();
             clientsocket.close(); 
             out3.close();
         }
    catch(IOException e)
         {
            Log.e(TAG, e.getMessage()); 
         }
     catch(Exception e1)
         {
           Log.e1(TAG, e1.getMessage());    
         }

Я включил фрагмент своего кода. ReceiveBytes - это определенный пользователем класс. Это выглядит следующим образом.

    public class ReceiveBytes
        {
     public ReceiveBytes(){};
     private Socket src_file;
     private FileOutputStream dest_file;
     private int MaxTransferbytes = 1024;


     public ReceiveBytes (Socket Src, FileOutputStream Dest)
     {
    src_file = Src;
    dest_file =Dest;
         }


      public int copyfile () throws Exception 
      {
      BufferedInputStream in = null;
      BufferedOutputStream output = null;
      int off=0;
      int received =0;
      int k;
      byte[] buffer = new byte[2*MaxTransferbytes];


      try 
      {
      in = new BufferedInputStream(src_file.getInputStream());
      output = new BufferedOutputStream(dest_file);

      while(in.available()>0)
      {
         k = in.available();
             if(k>MaxTransferbytes)
             {
             try
                      {
                   received = in.read(buffer,0,(MaxTransferbytes));
                       output.write(buffer,0,received);
                      }
                 catch(IOException e1)
                      {
                       Log.e1(TAG, e1.getMessage());    
                      }
               }
             else
             {
                 try
                      {
                   received = in.read(buffer,0,(k));
                       output.write(buffer,0,received);
                      }
                  catch(IOException e1)
                      {
                       Log.e1(TAG, e1.getMessage());    
                      }
              }

            }


    } 
    catch(Exception e) 
    {
       System.out.printf(e.getMessage());
     } 

      return(1);
     }
     }

Здесь, на каждой итерации, я передаю 1024 байта. Таким образом, для копирования большого файла требуется немало итераций. Однако это приводит к сбою приложения. Любые предложения о том, как я могу сделать это без сбоя приложения? Большое спасибо.

...