このように ByteArrayOutputStreams を使用してソケット経由で画像を送信しています。
ImageIO.write(image, "gif", byteArrayO);
byte [] byteArray = byteArrayO.toByteArray();
Connection.pw.println("" + byteArray.length);
int old = Connection.client.getSendBufferSize();
Connection.client.setSendBufferSize(byteArray.length);
Connection.client.getOutputStream().write(byteArray, 0, byteArray.length);
すべて正常に動作し、画像は最終的に 130kb のようになり、このように受け取ります
int nbrToRead = Integer.parseInt(slave.input.readLine().trim());
int old = slave.socket.getReceiveBufferSize();
slave.socket.setReceiveBufferSize(nbrToRead);
byte[] byteArray = new byte[nbrToRead];
int nbrRd = 0;
int nbrLeftToRead = nbrToRead;
while (nbrLeftToRead > 0) {
int rd = slave.socket.getInputStream().read(byteArray, nbrRd, nbrLeftToRead);
if (rd < 0)
break;
nbrRd += rd;
nbrLeftToRead -= rd;
}
ByteArrayInputStream byteArrayI = new ByteArrayInputStream(byteArray);
BufferedImage img = ImageIO.read(byteArrayI);
うまく機能しますが、Java のメモリ ヒープに送信されるすべての画像が 50 MB ほど増加します。receivebuffersize を設定しようとしましたが、それでもそのままです。ヒープが最大になり、しばらく留まってから停止します。
バッファをクリアして、バイトを受信したときにそれらを破棄するにはどうすればよいですか?