Java 客户端-服务器通信故障

Java 客户端-服务器通信故障,java,client-server,Java,Client Server,在客户端和服务器之间跳转对象时遇到问题 创建一个对象。更新一些字段。发送到服务器。(此部分有效) SomeObject thisObject = new SomeObject(); thisObject.setSomeValue(13); // update object to be sent PrintStream toServer = new PrintStream(sock.getOutputStream()); ObjectOutputStream oos = ne

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

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

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();
但是到了从客户端取回对象的时候。。程序失败,套接字关闭异常

ObjectInputStream objFromServer = new ObjectInputStream(
    new BufferedInputStream(sock.getInputStream()));      //java.net.SocketException: Socket is closed

thisObject = (Served) objFromServer.readObject();
....

请帮助我理解这个问题

我猜您正在使用相同的
套接字
从客户端发送和接收数据。当您在客户端上关闭
ObjectOutputStream
时,这将关闭基础
OutputStream
,从而关闭
sock
。然后,当您尝试在下面重用它时,它被关闭并抛出异常


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

能否显示创建
套接字
的代码?它非常简单,只要
套接字sock=新套接字(服务器名称,服务器端口)这可能不是问题所在,但仍然是:为什么您同时拥有
oos.writeObject(thisObject);oos.close()
toServer.println(oos);toServer.flush()在第一步中?你不需要第一对线吗?
PrintStream.println()
甚至可以接受一个
ObjectOutputStream
作为参数,这有什么意义吗?客户端是否重复使用相同的
sock
?关闭来自
套接字的流将关闭套接字。对,我的意思是
oos.writeObject(thisObject)
部分没有完成将对象发送到服务器的任务吗?好的,保罗。这似乎正是我所看到的问题。