【发布时间】:2012-08-10 23:38:51
【问题描述】:
我正在使用这样的 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。我尝试设置接收缓冲区大小,但它仍然保持不变。它在堆中达到最大值,然后停留一段时间然后停止。
我怎样才能清除缓冲区,以便当它接收到字节时会处理掉它们?
【问题讨论】:
-
泄漏在哪一侧,客户端还是服务器?
-
Connection 是持有客户端的类,它是套接字。
-
当您创建
BufferedImages 时,您也必须调用flush()s。
标签: java sockets inputstream outputstream