在socket编程中,如果在一个while循环中使用:

ObjectInputStream reader = new ObjectInputStream(socket.getInputStream);
reader.readObject();

可能会出现EOFException,
看了网上的很多答案和解释,觉得都不对,网上都说是因为已经到达文件末尾了,而reader还在读取数据,所以在报错
其实,这是不对的,在循环中调用它本没有错,在while循环中如果没有数据可读了,它会自动阻塞,有数据来的时候就会读,所以在这种情况下根本不会出现

到达文件末尾了,而reader还在读

的问题,那么出现这种情况的原因是什么呢?
其实是代码业务逻辑的问题,导致reader在读的时候,socket被关闭,reader被关闭,连接被关闭等等,所以完全是代码设计的问题,

另外在使用ObjectOutputStreamObjectInputStream的时候要注意一个问题,这两者创建的顺序需要遵循一定的约定,ObjectInputStream的创建需要ObjectOutputStream创建后的一些数据,所以它一般在ObjectOutputStream之前。创建好ObjectOutputStream之后,还会先向流中先写入4个字节的数据,创建ObjectInputStream的时候会相应的将其读出来,所以,不能多次创建ObjectOutputStream,因为这会导致多次写入数据,


心晴good
804 声望18 粉丝

你还不够霸气!!