サーバーから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
で試しました。文字列が大きい場合、それらすべてで OutOfMemory 例外が発生します。100K程度の小さなデータでテストしたところ、完全に機能しました。InputStreamReader
IOUtils
StringBuilder
BufferedReader
サーバー側で発生する例外は、「ピアによって接続がリセットされました。ソケット書き込みエラーです。」