2017-02-14 2 views
3

Я написал этот код для передачи файла с сервера на клиент, но я могу отправить только размер файла размером менее 1 КБ. Я хочу отправить любой размер файла. Было бы очень полезно, если бы вы могли изменить мой код:Как отправить большой файл с помощью сокета в android

File Sender (код сервера)

protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     infoIp = (TextView) findViewById(R.id.infoip); 
     infoPort = (TextView) findViewById(R.id.infoport); 

     infoIp.setText(getIpAddress()); 

     serverSocketThread = new ServerSocketThread(); 
     serverSocketThread.start(); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     if (serverSocket != null) { 
      try { 
       serverSocket.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

    private String getIpAddress() { 
     String ip = ""; 
     try { 
      Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface.getNetworkInterfaces(); 
      while (enumNetworkInterfaces.hasMoreElements()) { 
       NetworkInterface networkInterface = enumNetworkInterfaces.nextElement(); 
       Enumeration<InetAddress> enumInetAddress = networkInterface.getInetAddresses(); 

       while (enumInetAddress.hasMoreElements()) { 
        InetAddress inetAddress = enumInetAddress.nextElement(); 

        if (inetAddress.isSiteLocalAddress()) { 
         ip += "SiteLocalAddress: "+ inetAddress.getHostAddress() + "\n"; 
        } 
       } 
      } 

     } catch (SocketException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      ip += "Something Wrong! " + e.toString() + "\n"; 
     } 

     return ip; 
    } 

    public class ServerSocketThread extends Thread { 

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

      try { 
       serverSocket = new ServerSocket(SocketServerPORT); 
       MainActivity.this.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         infoPort.setText("I'm waiting here: " 
           + serverSocket.getLocalPort()); 
        }}); 

       while (true) { 
        socket = serverSocket.accept(); 
        FileTxThread fileTxThread = new FileTxThread(socket); 
        fileTxThread.start(); 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } finally { 
       if (socket != null) { 
        try { 
         socket.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
    } 

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

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

      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(); 
       System.out.println("socket getIntentAddress "+socket.getInetAddress()); 
       MainActivity.this.runOnUiThread(new Runnable() { 

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

        }}); 

      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       System.out.println("Ioexception"+e); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       } finally { 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
        System.out.println("Ioexception"+e); 
       } 

файл приемник (код клиента)

buttonConnect.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       ClientRxThread clientRxThread = 
         new ClientRxThread(editTextAddress.getText().toString(),SocketServerPORT); 

       clientRxThread.start(); 
      }}); 
    } 

    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); 


       File file = new File(Environment.getExternalStorageDirectory(),"test.mp3"); 

       byte[] bytes = new byte[1024]; 


       InputStream is = socket.getInputStream(); 
       FileOutputStream fos = new FileOutputStream(file); 
       BufferedOutputStream bos = new BufferedOutputStream(fos); 
       int bytesRead = is.read(bytes, 0, bytes.length); 
       bos.write(bytes, 0, bytesRead); 
       bos.close(); 
       // socket.close(); 

       MainActivity.this.runOnUiThread(new Runnable() { 

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

      } catch (IOException e) { 

       e.printStackTrace(); 

       final String eMsg = "Something wrong: " + e.getMessage(); 

       MainActivity.this.runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 
         Toast.makeText(MainActivity.this,eMsg,Toast.LENGTH_LONG).show(); 
         System.out.println("run"+eMsg); 
        }}); 

      } finally { 
       if(socket != null){ 
        try { 

         socket.close(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 

        } 

Пожалуйста, помогите сэру! Заранее спасибо!

+0

Что произойдет, если вы попробуете отправить более крупный файл? Вы получаете какие-либо ошибки? –

+0

Данные передаются только размером файла 1 КБ, но я хочу передать файл большого размера. пожалуйста, помогите мне, если есть какое-либо решение. Спасибо –

+0

См. мой ответ. Ваш клиент не читает все доступные данные. –

ответ

1

Я мог бы поклясться, что ваши первоначальные вопросы касались получения, а не отправки (и другие ответы, похоже, предлагают то же самое).

Независимо от того, чтобы отправлять большие файлы, вы можете либо прочитать весь свой файл в буфер, достаточно большой для его хранения (при условии, что файл имеет разумный размер), либо использовать цикл для чтения в кусках управляемого размера а затем обработать (отправить) куски.

В ответ на ваш первоначальный вопрос вы читаете только 1024, потому что это все, что вы пытаетесь прочитать. Вы выделили свой буфер на 1024 и только один раз.

  byte[] bytes = new byte[1024]; 
... 
      int bytesRead = is.read(bytes, 0, bytes.length); 
      bos.write(bytes, 0, bytesRead); 
      bos.close(); 

попробовать

byte[] bytes = new bytes[1024]; 
... 
int bytesRead = is.read(bytes, 0, bytes.length); 
while(bytesRead > 0) { 
    bos.write(bytes, 0, bytesRead); 
    bytesRead = is.read(bytes, 0, bytes.length); 
} 
... 

и обернуть свой код в соответствующем месте с попытаться/поймать блока в случае исключения.

1

Необходимо ввести прием байтов в цикле, который завершается только тогда, когда все данные получены. Например: -

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(); 
+0

Убедитесь, что вы используете это в Сервисе или Thread, так как деятельность может быть убита в любое время. Служба Foreground работает активно. Если вы хотите справиться с этим в фоновом режиме, убедитесь, что вы сохранили «состояние» и возобновите его, пока служба не вернется. –

+0

Вы пробовали выполнить код в своей среде IDE? –

+0

с помощью этого кода я отправляю 55mb размер файла правильно. но когда я пытаюсь передать 500-мегабайтный размер файла, тогда он показывает ошибку - Throwing OutOfMemoryError «Не удалось выделить выделение байтов 360318346 с 5802592 бесплатными байтами и 87 МБ до тех пор, пока OOM» и приложение не будет автоматически разбито System.err: java.net.SocketException: Закрыто гнездо Thanks. –

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