我有一个服务器和客户端应用程序。我使用一个连接来使用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,但我的客户端应用程序仍在运行。它还在等待一个物体。它会永远读。我该如何解决?我无法提供代码,因为它很难理解。
答案 0 :(得分:1)
你可能在while循环中为readObject()调用设置了try {} catch块。如果将它放在while循环之外,异常会导致执行跳转到循环之外
答案 1 :(得分:0)
当它到达流的末尾时抛出EOFException
。
当然,如果你中止对等体,挂起的读取将永远不会看到流的结束。解决方法是在套接字上读取超时。