0

我在客户端和服务器之间弹跳对象时遇到问题。

创建一个对象。更新一些字段。发送到服务器。(这部分有效)

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();
....

请帮助我理解问题

4

1 回答 1

2

我的猜测是您使用相同Socket的方式从客户端发送和接收。当您关闭ObjectOutputStream客户端上的 时,这会关闭底层证券OutputStream,从而关闭sock。然后,当您尝试在下面重用它时,它已被关闭并引发异常。

相反,在关闭客户端代码中的资源之前等待事务完成(顺便说一下,这应该在一个finally块中完成)。或者,如果等待有问题,请改用新的Socket

于 2012-04-08T02:43:44.480 回答