客户服务器通信故障

时间:2012-04-08 02:26:22

标签: java client-server

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

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

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

请帮我理解这个问题

1 个答案:

答案 0 :(得分:2)

我的猜测是你使用相同的Socket来发送和接收客户端。关闭客户端上的ObjectOutputStream时,会关闭基础OutputStream,关闭sock。然后,当您尝试在下面重复使用它时,它已被关闭并抛出异常。

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