使用socket时遇见的java.io.EOFException异常

这个博客解决了我的疑惑:https://www.cnblogs.com/yiwangzhibujian/p/7107084.html

我出现的原因主要是我使用了ObjectInputStream和ObjectOutputStream流,传递对象的方式传递数据。并且,我在catch中做了关闭流和socket的操作,导致出现这个异常后,就无法继续后面的流程了。

解决方式:

1、单独catch,与别的异常处理方式区分开

2、使用别的输入输出流代替ObjectInputStream的形式的流。

下面是使用方式一的简单示例。

客户端发送:

public void send(User user){
    try{
        ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());
        oos.writeObject(user);
        oos.flush();
    }catch (Exception e) {
           
    }finally {
        if(oos!=null){
            oos.close();
        }
    }
}


服务端接收:(其实在捕获的Exception中是包含EOFException的,但是我在Exception中做了一些流的关闭等操作,所以就会有java.io.EOFException异常的出现)

public void receive(){
    try{
        ObjectInputStream ois = new ObjectInputStream(serverSocket.getInputStream());
        User user = (User) ois.readObject();
    }catch(EOFException eof){
        //单独捕获这个异常
    }catch (Exception e) {
        //这里再做先前的流和socket的关闭,就不会因EOFException的问题,而导致程序中断的问题了。
    }finally {
        if(ois!=null){
            ois.close();
        }
    }
}

注:代码中的User是要发送的对象类,实现了Serializable接口。

另:

在使用objectOutputStream和ObjectInputStream时,也有时会有java.lang.ClassCastException的异常,这个通过输出的日志,很容易可以知道,是因为,客户端和服务端创建的对象类不同,不仅类名要相同,包名也要相同。

猜你喜欢

转载自blog.csdn.net/aianzxy/article/details/90484999