Я пытался перенести музыкальный файл с одного телефона 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 байта. Таким образом, для копирования большого файла требуется немало итераций. Однако это приводит к сбою приложения. Любые предложения о том, как я могу сделать это без сбоя приложения? Большое спасибо.