2017-02-21 1 views
0

Ich arbeite an Transferdatei von Server zu Client Beispiel. Wenn ich versuche, große Datei zu übertragen (in Beispiel ich habe 500MB Video-Datei) dann zeigt es Fehler Android: java.lang.OutOfMemoryError Konnte eine 360318346 Byte-Zuweisung mit 5802592 freien Bytes und 87MB bis OOM zuordnen. Bitte helfen Sie mir, diesen Fehler zu beheben.Android: java.lang.OutOfMemoryError Konnte eine 360318346 Bytezuweisung mit 5802592 freien Bytes und 87MB nicht zuordnen, bis OOM

Server-Seite einige Frieden Code

public class FileTxThread extends Thread { 
    Socket socket; 
    FileTxThread(Socket socket){ 
     this.socket= socket; 
    } 

    @Override 
    public void run() { 
     File file = new File(Environment.getExternalStorageDirectory(),"RAHASYA.mp4"); 


     byte[] bytes = new byte[(int) file.length()]; 


     BufferedInputStream bis; 
     try { 
      bis = new BufferedInputStream(new FileInputStream(file)); 
      bis.read(bytes, 0, bytes.length); 
      OutputStream os = socket.getOutputStream(); 
      os.write(bytes, 0, bytes.length); 
      os.flush(); 
      // socket.close(); 

      final String sentMsg = "File sent to: " + socket.getInetAddress(); 

      MainActivity.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        Toast.makeText(MainActivity.this,sentMsg,Toast.LENGTH_LONG).show(); 

       }}); 

Client-Seite einige Frieden Code

private class ClientRxThread extends Thread { 
    String dstAddress; 
    int dstPort; 

    ClientRxThread(String address, int port) { 
     dstAddress = address; 
     dstPort = port; 
    } 

    @Override 
    public void run() { 
     Socket socket = null; 

     try { 
      socket = new Socket(dstAddress, dstPort); 

      out.println("Sockt "+socket.getInetAddress()); 

      File file = new File(Environment.getExternalStorageDirectory(),"RAHASYA.mp4"); 


      byte[] bytes = new byte[1024]; 


      InputStream is = socket.getInputStream(); 
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); 
      while (true) { 
       int bytesRead = is.read(bytes); 
       if (bytesRead < 0) break; 
       bos.write(bytes, 0, bytesRead); 
       // Now it loops around to read some more. 
      } 
      bos.close(); 


      MainActivity.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        Toast.makeText(MainActivity.this,"Finished",Toast.LENGTH_LONG).show(); 
       }}); 

Antwort

0

Ihre Byte-Array auf Server-Seite zu groß ist, ändern Sie es kleiner und versuchen?
Referenz:

File file = new File(Environment.getExternalStorageDirectory(),"RAHASYA.mp4"); 
    byte[] bytes = new byte[2048]; 
    BufferedInputStream bis; 
    try { 
     bis = new BufferedInputStream(new FileInputStream(file)); 
     OutputStream os = socket.getOutputStream(); 
     int read = bis.read(bytes, 0, bytes.length); 
     while (read!=-1){ 
      os.write(bytes, 0, read); 
      os.flush(); 
      read = bis.read(bytes, 0, bytes.length); 
     } 

     //...and so on 
+0

wie man ändert. ich bin Anfänger, ich habe verwirrt, wo ich Änderung in meinem Serverseitencode habe bitte helfen Sie mir. Danke! –

+0

ändern Sie dies: byte [] bytes = neues Byte [(int) file.length()]; –

+0

Bitte sagen Sie mir, welchen Code ich in dieser Zeile hinzufügen muss byte [] bytes = new byte [(int) file.length()]. Vielen Dank! –

0

Ihr Problem ist die Linie

byte[] bytes = new byte[(int) file.length()];

Sie sind ein Array von der Größe der gesamten Datei. Sie müssen ein Stück nach dem anderen lesen.

+0

jawohl, aber bitte geben Sie mir eine Andeutung, wie man Datei in Bit liest, ich habe versucht, aber ich weiß nicht, ob es richtig oder falsch ist, weil es nicht funktioniert, bitte helfen. Danke, mein Herr. –

+0

Tun Sie, was Sie auf der Client-Seite tun, aber auf der Server-Seite (Ändern der Lesevorgänge in schreibt obv). –

Verwandte Themen