2016-12-13 8 views
0

Я хочу передать файл на Socket-соединение, используя IP-адрес точки доступа Wi-Fi и MAC-адрес между двумя устройствами Android. Я могу передать текстовый файл с меньшим количеством чем 1 КБ, но не могут отправлять другие файлы расширения и большего размера с помощью сокета. Ниже приведен код для стороны отправителя: -Невозможно передать файлы большего размера через wi-fi hotspot в Android

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

      byte[] bytes = new byte[(int) file.length()]; 
      BufferedInputStream bis; 
      try { 
       socket = new Socket(dstAddress, dstPort); 
       bis = new BufferedInputStream(new FileInputStream(file)); 
       bis.read(bytes, 0, bytes.length); 
       OutputStream os = socket.getOutputStream(); 
       os.write(bytes, 0, bytes.length); 
       os.flush(); 
       if (socket != null) { 
        socket.close(); 
       } 

       final String sentMsg = "File Sent....."; 
       ((Activity)context_con).runOnUiThread(new Runnable() { 

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


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

Это код для приемника End: -

  try { 
      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(); 

      final String sentMsg = "File Received..."; 
      Main.this.runOnUiThread(new Runnable() { 

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

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

Я хочу передать большие файлы размером как mp3 файл, но он создает только размер файла 1Kb на конец приемника не с точным размером 2,1 МБ. Пожалуйста, помогите мне, где я ошибаюсь в этой реализации.

+0

Вы считаете, что сжимаете их, а затем отправляете? – Olu

+0

Взгляните на это [это] (http://www.helloandroid.com/tutorials/simple-connection-example-part-ii-tcp-communication) – Olu

+0

Я не сжимаю файлы .. –

ответ

0

Сложите это, но не проверили. Это должно дать некоторые подсказки

//Server side snippet 
public void server(int port) throws IOException { 
    try (ServerSocket serverSocket = new ServerSocket(port); Socket socket = serverSocket.accept()) { 
     try (InputStream in = socket.getInputStream(); OutputStream out = new FileOutputStream("test.mp3")) { 
      byte[] bytes = new byte[2 * 1024]; 

      int count; 
      while ((count = in.read(bytes)) > 0) { 
       out.write(bytes, 0, count); 
      } 
     } 
    } 
} 

//client side 
public static void client(String dstAddress, int dstPort) throws IOException { 
    try (Socket socket = new Socket(dstAddress, dstPort)) { 
     File file = new File(Environment.getExternalStorageDirectory(), "test.mp3"); 

     // Get the size of the file 
     long length = file.length(); 
     if (length > 0) { 
      byte[] bytes = new byte[2 * 1024]; 
      InputStream in = new FileInputStream(file); 
      OutputStream out = socket.getOutputStream(); 

      int count; 
      while ((count = in.read(bytes)) > 0) { 
       out.write(bytes, 0, count); 
      } 
      out.close(); 
      in.close(); 
     } 
    } 
} 

Вы можете выбрать, чтобы обернуть ресурсы с примерки уловом, как я сделал, или вы можете не делать этого. Подумайте, как настроить размер буфера. Рассмотрите this

Пожалуйста, попробуйте это.

+0

Спасибо Olu, теперь я могу отправлять файлы большего размера: - –

+0

Я использовал этот код socket = new Socket (dstAddress, dstPort); Файл файла = новый файл (Environment.getExternalStorageDirectory(), "test.mp3"); byte [] bytes = new byte [(int) file.length()]; BufferedInputStream bis; bis = new BufferedInputStream (новый FileInputStream (файл)); bis.read (bytes, 0, bytes.length); ObjectOutputStream oos = new ObjectOutputStream (socket.getOutputStream()); oos.writeObject (байты); oos.flush(); –

+0

Ну, вы всегда можете настроить размер буфера, если у вас не хватает памяти – Olu