2

サーバーから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());
}

したがって、問題は、inputStreamOutOfMemoryException を取得する場所から読み取っている行に発生します。ストリームから文字列を読み取るさまざまな例を使用してみました。、、、、、などBufferedInputStreamで試しました。文字列が大きい場合、それらすべてで OutOfMemory 例外が発生します。100K程度の小さなデータでテストしたところ、完全に機能しました。InputStreamReaderIOUtilsStringBuilderBufferedReader

サーバー側で発生する例外は、「ピアによって接続がリセットされました。ソケット書き込みエラーです。」

4

2 に答える 2

2

クライアントでバイトごとに読み取り、バイトごとにファイルに書き込むことができます。この方法では、文字列全体をメモリに保持する必要はありません。

そしてもちろん、文字列全体を一度にではなく、トークンまたは行ごとにそのファイルを読み取ります

于 2013-10-07T11:58:39.280 に答える