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

    xiaoxiao2022-07-13  151

    这个博客解决了我的疑惑: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的异常,这个通过输出的日志,很容易可以知道,是因为,客户端和服务端创建的对象类不同,不仅类名要相同,包名也要相同。

    最新回复(0)