我在客户端和服务器之间弹出对象时遇到问题。
创建一个对象。更新一些字段。发送到服务器。 (这部分有效)
SomeObject thisObject = new SomeObject();
thisObject.setSomeValue(13); // update object to be sent
PrintStream toServer = new PrintStream(sock.getOutputStream());
ObjectOutputStream oos = new ObjectOutputStream(toServer);
oos.writeObject(thisObject);
oos.close();
toServer.println(oos); // send object to server
toServer.flush();
在此之后,服务器会进一步更新某个值并将其设置为1919;
ObjectInputStream objFromClient = new ObjectInputStream(new BufferedInputStream(
sock.getInputStream()));
Served thisObject = (Served) objFromClient.readObject();
thisObject.setSomeValue(1919);
然后,服务器将对象发送回客户端
toClient = new PrintStream(sock.getOutputStream());
ObjectOutputStream oos = new ObjectOutputStream(toClient);
oos.writeObject(thisObject);
oos.close();
objFromClient.close();
sock.close();
但是当时间到了客户端拿回对象时..程序因Socket Closed异常而失败
ObjectInputStream objFromServer = new ObjectInputStream(
new BufferedInputStream(sock.getInputStream())); //java.net.SocketException: Socket is closed
thisObject = (Served) objFromServer.readObject();
....
请帮我理解这个问题
答案 0 :(得分:2)
我的猜测是你使用相同的Socket
来发送和接收客户端。关闭客户端上的ObjectOutputStream
时,会关闭基础OutputStream
,关闭sock
。然后,当您尝试在下面重复使用它时,它已被关闭并抛出异常。
相反,在关闭客户端代码中的资源之前等待事务完成(顺便说一句,这应该在finally
块中完成)。或者,如果等待有问题,请改为使用新的Socket
。