2015-07-15 35 views
5

Şu anda Android cihazım için küçük bir soket uygulaması oluşturmaya çalışıyorum.Android büyük dosyaları soket aracılığıyla gönder

Dizüstü bilgisayarım/PC'mize ya da her neyse bir soket bağlantısıyla büyük dosyaları (~ 500MB) göndermek istiyorum. Ben bir test alanı (~ 460MB) benim app çöküyor göndermeye çalıştığınızda, benim PC soket sunucusuna bağlanmak ancak benim Android cihazınızda bir soket istemcisi kullanıyorum ve şöyle der:

"OutOfMemoryError Fırlatma " "OOM kadar 441616290 bayt allocationwith 4194304 serbest bayt ve 90MB ayrılamadı"

Ben müvekkilim dosya boyutunu işleyemez sanırım. Yani benim sorum: bir TCP soket bağlantısı ile böyle büyük dosyaları işlemek için bir yol var mı? Kodum küçük dosyalar (ör. 5MB) ile iyi çalışır, ancak daha büyük dosyalarla başarısız olur.

İstemci tarafı benim android cihaz üzerinde çalışan:

Bu

Bugüne kadar ne var

private class Connecting extends AsyncTask<String, Integer, String> 
{ 
    @Override 
    protected String doInBackground(String... serverAdd) 
    { 
     String filePath = "Path to file"; 

     File sdFile = new File(filePath); 

     try { 

      client = new Socket("ip", "port"); 

      outputStream = client.getOutputStream();     
      byte[] buffer = new byte[1024]; 
      FileInputStream in = new FileInputStream(sdFile); 
      int rBytes; 
      while((rBytes = in.read(buffer, 0, 1024)) != -1) 
      { 
       outputStream.write(buffer, 0, rBytes); 
      } 

      outputStream.flush(); 
      outputStream.close(); 
      client.close(); 


     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

Sunucu tarafı:

public class Main { 

private static ServerSocket serverSocket; 
private static Socket clientSocket; 
private static InputStream inputStream; 
private static FileOutputStream fileOutputStream; 
private static BufferedOutputStream bufferedOutputStream; 
private static int filesize = 10000000; 
private static int bytesRead; 
private static int current = 0; 

public static void main(String[] args) throws IOException { 

    serverSocket = new ServerSocket(10898); 

    System.out.println("Server started. Listening to the port 10898"); 

    clientSocket = serverSocket.accept(); 

    byte[] mybytearray = new byte[filesize]; 

    inputStream = clientSocket.getInputStream(); 
    fileOutputStream = new FileOutputStream("E:\\output.zip"); 
    bufferedOutputStream = new BufferedOutputStream(fileOutputStream); 

    System.out.println("Receiving..."); 

    bytesRead = inputStream.read(mybytearray, 0, mybytearray.length); 
    current = bytesRead; 

    do { 
     bytesRead = inputStream.read(mybytearray, current, (mybytearray.length - current)); 
     if (bytesRead >= 0) { 
      current += bytesRead; 
     } 
    } while (bytesRead > -1); 


    bufferedOutputStream.write(mybytearray, 0, current); 
    bufferedOutputStream.flush(); 
    bufferedOutputStream.close(); 
    inputStream.close(); 
    clientSocket.close(); 
    serverSocket.close(); 

    System.out.println("Sever recieved the file"); 

} 
} 

Selamlamak

[DÜZENLE]: Müşteri kodu.

+1

Dosyanızı daha küçük dosyalara ayırmanız gerekir; bunlar genellikle yığınlar olarak adlandırılır. İşte bir örnek: C: http://stackoverflow.com/questions/1628587/writing-memory-to-socket-in-chunks-in-c – Cookster

+1

Tüm dosyayı bir kerede okuma, bunu yap daha küçük parçalar. – Buddy

+0

Tamam, bu bilgi için teşekkür ederim, çünkü bu kodu incelemek için biraz zamana ihtiyacım var çünkü c ile aşina değilim. –

cevap

3

Bir dosyanın nasıl yükleneceği hakkında Java için örnek kod. Bunu TCP/IP istemci-sunucu uygulamanıza kabul edebilirsiniz. Numuneyi aldığım yerde daha fazla parça var (Java - Read file by chunks?).

char[] myBuffer = new char[1024]; 
int bytesRead = 0; 
BufferedReader in = new BufferedReader(new FileReader("foo.txt")); 
while ((bytesRead = in.read(myBuffer, 0, 1024)) != -1) 
{ 
    ... 
} 
+0

tamam bana yardımcı oldu, hatayı buldum ve dosyayı sunucuma gönderiyor. Hepinize çok şey harcıyor :) –

İlgili konular