目前我正在尝试为我的Android设备创建一个小套接字应用程序。
我想通过套接字连接将大文件(~500MB)发送到我的笔记本电脑/ PC或其他任何东西。我在我的Android设备上使用套接字客户端连接到我的PC上的套接字服务器但是,当我尝试发送测试字段(~460MB)时,我的应用程序崩溃了,它说:
“抛出OutOfMemoryError”无法分配441616290字节 分配4194304空闲字节和90MB直到OOM“”
我猜我的客户端无法处理此文件大小。所以我的问题是:有没有办法用TCP套接字连接来处理这些大文件?我的代码可以很好地处理小文件(例如5MB),但是文件较大时会失败。
这是我到目前为止所做的:
客户端在我的Android设备上运行:
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;
}
}
服务器端:
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");
}
}
格尔茨
[编辑]:客户代码。
答案 0 :(得分:3)
以下是关于如何将文件分块的Java示例代码。您可以将此方法应用于TCP / IP客户端 - 服务器应用程序。有关分块的更多信息,请点击此处(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)
{
...
}