这个问题真让我难过。我使用ObjectOutputStream
将图像从客户端发送到服务器,但随着时间的推移,Java堆不断增长。这最终会导致OutOfMemoryError
异常。经过一些在线研究后,重置方法似乎是唯一的解决方案。哪个好,但使用它会导致错误:不支持标记/重置。我能找到的唯一一页是:
https://stackoverflow.com/questions/38814424/how-can-i-get-an-objectinputstream-that-supports-mark-reset
我不确定如何处理该页面的答案。
无论如何,这是服务器代码:
ServerSocket vchatserver = new ServerSocket(6677);
Socket c1 = vchatserver.accept();
ObjectInputStream ois = new ObjectInputStream(c1.getInputStream());
while(c1.isConnected()) {
ImageIcon icon = (ImageIcon) ois.readUnshared();
ois.reset();
}
现在是客户的代码:
Socket vchatclient = new Socket(pub_serverName, 6677);
ObjectOutputStream oos = new ObjectOutputStream(vchatclient.getOutputStream());
while(vchatclient.isConnected()) {
ImageIcon img = new ImageIcon(webcam.getImage());
oos.writeUnshared(img);
oos.reset();
Thread.sleep(25);
}
答案 0 :(得分:1)
对象输入流不支持标记/重置。但你不需要它。您不需要在输入流上调用reset()
。 ObjectOutputStream.reset()
就足够了。
您链接的问题无关紧要。
NB while (c1.isConnected())
不是流结束的有效测试。你需要抓住EOFException
。同样地,while (vchatclient.isConnected())
在写作时不会保护您免受IOExceptions
的攻击。此方法仅告诉您是否已连接此套接字。它没有告诉你关于连接的当前状态的任何信息。