处理终止套接字"客户端"的正确方法是什么?

时间:2017-07-13 16:09:22

标签: java sockets

我有socket服务器/客户端应用程序。 "服务器"正在等待来自"客户端"的数据,但如果客户端已被终止,则服务器会抛出EOFException

我在服务器套接字的代码中的某处:

private ObjectInputStream in;

在某处我读了数据:

in.readObject();

我应该只围绕in.readObject();在try-catch块还是有另一种解决方案?

2 个答案:

答案 0 :(得分:2)

如果您查看ObjectInputStream.readObject的Javadoc API,您将看到异常列表

  • ClassNotFoundException - 序列化对象的类不能 找到。
  • InvalidClassException使用的类有问题 序列化。
  • StreamCorruptedException流中的控制信息不一致。
  • OptionalDataException在流中找到原始数据而不是对象。
  • IOException - 任何常见的输入/输出相关异常。

IOException(其中99%的时间是SocketException(IOException的子类)是Socket已关闭的特殊情况,因此您应该像处理连接一样处理它。

然而,所有其他例外情况都表明您的客户正在向您发送您不期望的内容。您应该按名称捕获每个例外,并发回一条消息,说明他们需要将客户端软件版本更新为服务器准备与之通信的版本。将该消息刷新,然后最好关闭套接字。

答案 1 :(得分:1)

您可以使用以下内容。 EOFExceptionIOException的直接子类。你还应该抓住IOException

try{
    ....
    in.readObject();
    ....
} catch(EOFException ex1){
    // eof exception is thrown
} catch(IOException ex2){
    // other types of IO exception is thrown
}