2015-07-15 24 views
5

Hiện tại tôi đang cố gắng tạo một ứng dụng ổ cắm nhỏ cho thiết bị Android của mình.Android gửi tệp lớn qua ổ cắm

Tôi muốn gửi các tệp lớn (~ 500MB) qua kết nối ổ cắm với Máy tính xách tay/PC của tôi hoặc bất kỳ thứ gì. Tôi đang sử dụng một khách hàng ổ cắm trên thiết bị Android của mình để kết nối với máy chủ socket trên máy tính của mình nhưng, khi tôi cố gắng gửi trường thử nghiệm (~ 460MB) ứng dụng của tôi bị lỗi và nói:

"Throw OutOfMemoryError "không thể phân bổ một 441616290 byte allocationwith 4.194.304 byte miễn phí và 90MB cho đến khi oom""

tôi đoán khách hàng của tôi không thể xử lý này kích thước tập tin. Vì vậy, câu hỏi của tôi: là có một cách để xử lý các tập tin lớn như vậy với một kết nối socket TCP ?. Mã của tôi hoạt động tốt với ít tệp (ví dụ: 5MB) nhưng không thành công với tệp lớn hơn.

Đây là những gì tôi có cho đến nay:

Phía client chạy trên thiết bị Android của tôi:

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

Server side:

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

} 
} 

Greetz

[EDIT]: Mã máy khách.

+1

Bạn cần chia nhỏ tệp của mình thành các tệp nhỏ hơn, thường được gọi là các đoạn. Dưới đây là một ví dụ, trong C: http://stackoverflow.com/questions/1628587/writing-memory-to-socket-in-chunks-in-c – Cookster

+1

Không đọc toàn bộ tệp trong cùng một lúc, hãy thực hiện các đoạn nhỏ hơn. – Buddy

+0

Ok cảm ơn bạn vì thông tin đó tôi cần một chút thời gian để xem xét mã này vì tôi không quen thuộc với c. –

Trả lời

3

Đây là mã mẫu cho Java về cách chia nhỏ một tệp. Bạn có thể áp dụng điều này cho ứng dụng client-server TCP/IP của bạn. Thêm chi tiết về chunking có sẵn ở đây (Java - Read file by chunks?), nơi tôi lấy mẫu từ.

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

ok đã giúp tôi tôi tìm thấy lỗi của mình và nó đang gửi tệp đến máy chủ của tôi. Xe tăng rất nhiều cho tất cả các bạn :) –

Các vấn đề liên quan