即使在连接关闭后,readObject也会读取

时间:2016-02-06 22:41:29

标签: java sockets

我有一个服务器和客户端应用程序。我使用一个连接来使用Socket类发送对象。客户做这样的事情:

while(true)
{
  //in is ObjectInputStream I get from Socket
  MyObject object=(MyObject)in.readObject();
  //do something and then wait for another object to handle
}

一切都在本地网络中运行良好,但现在我的服务器在另一台机器上。如果我等待半小时然后停止服务器,客户端将继续读取对象。这是我的netstat -tnlpa

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      497/sshd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      527/sendmail
tcp        0      0 82.146.53.193:22            188.162.39.104:54454        ESTABLISHED 26849/sshd
tcp        0      0 82.146.53.193:22            91.245.35.88:50231          ESTABLISHED 26114/sshd
tcp        0      0 82.146.53.193:22            91.245.35.82:50617          ESTABLISHED 26312/sshd
tcp        0      0 82.146.53.193:22            188.162.39.104:13128        ESTABLISHED 26768/sshd
tcp        0     84 82.146.53.193:22            188.162.39.104:51065        ESTABLISHED 26487/sshd
tcp        0      0 82.146.53.193:22            91.245.35.88:50229          ESTABLISHED 26107/sshd
tcp        0      0 82.146.53.193:22            91.245.35.89:52246          ESTABLISHED 26821/sshd
tcp        0      0 :::22                       :::*                        LISTEN      497/sshd

我的服务器应用程序端口是2407.正如您所看到的那样,没有2407,但我的客户端应用程序仍在运行。它还在等待一个物体。它会永远读。我该如何解决?我无法提供代码,因为它很难理解。

2 个答案:

答案 0 :(得分:1)

你可能在while循环中为readObject()调用设置了try {} catch块。如果将它放在while循环之外,异常会导致执行跳转到循环之外

答案 1 :(得分:0)

当它到达流的末尾时抛出EOFException

当然,如果你中止对等体,挂起的读取将永远不会看到流的结束。解决方法是在套接字上读取超时。