【问题标题】:Client server communication trouble客户端服务器通信故障
【发布时间】:2012-04-08 10:43:44
【问题描述】:

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

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

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

请帮我理解问题

【问题讨论】:

  • 您能否显示创建Socket 的代码?
  • 就像Socket sock = new Socket(serverName, SERVER_PORT);一样简单
  • 这可能不是问题,但仍然:为什么您在第一步中同时拥有oos.writeObject(thisObject); oos.close();toServer.println(oos); toServer.flush();?你不只需要第一对线吗? PrintStream.println() 甚至可以接受 ObjectOutputStream 作为参数吗?这有意义吗?
  • 客户端是否重复使用相同的sock?关闭来自Socket 的流将关闭套接字。
  • 对,我的意思是oos.writeObject(thisObject)这块不是已经完成了对象到服务器的发送吗?

标签: java client-server


【解决方案1】:

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

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

【讨论】:

  • 保罗好。这似乎是我看到的确切问题。
猜你喜欢
  • 2012-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2011-09-05
  • 2012-03-01
  • 1970-01-01
  • 2021-11-12
相关资源
最近更新 更多