我在通过套接字从服务器发送大字符串到 android 客户端时遇到问题。
字符串大约 10MB。
将数据写入套接字的代码是这样的:
int socketTimeout = 200;
socket = new Socket(client.getHost(), client.getPort());
socket.setSoTimeout(socketTimeout);
OutputStreamWriter oos=new OutputStreamWriter(socket.getOutputStream());
String d = data.getData().toString() + "\n";
oos.write(d);
oos.flush();
从套接字读取数据的代码是这样的:
Socket s = params[0];
InputStream is = null;
try {
is = s.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[32768];
while ((nRead = is.read(data, 0, data.length)) != -1) {
baos.write(data, 0, nRead);
}
return new String(baos.toByteArray());
}
inputStream
所以问题出现在我从OutOfMemoryException读取的地方。我尝试使用从流中读取字符串的不同示例。我尝试使用BufferedInputStream
, InputStreamReader
, IOUtils
, StringBuilder
, BufferedReader
..etc。当字符串很大时,它们都会给我 OutOfMemory 异常。我用大约 100K 的较小数据进行了测试,它运行良好。
我在服务器端遇到的例外是“连接被对等方重置,套接字写入错误。”