在socket编程中,如果在一个while循环中使用:
ObjectInputStream reader = new ObjectInputStream(socket.getInputStream);
reader.readObject();
可能会出现EOFException,
看了网上的很多答案和解释,觉得都不对,网上都说是因为已经到达文件末尾了,而reader
还在读取数据,所以在报错
其实,这是不对的,在循环中调用它本没有错,在while
循环中如果没有数据可读了,它会自动阻塞,有数据来的时候就会读,所以在这种情况下根本不会出现
到达文件末尾了,而reader还在读
的问题,那么出现这种情况的原因是什么呢?
其实是代码业务逻辑的问题,导致reader
在读的时候,socket被关闭,reader被关闭,连接被关闭等等,所以完全是代码设计的问题,
另外在使用ObjectOutputStream
和ObjectInputStream
的时候要注意一个问题,这两者创建的顺序需要遵循一定的约定,ObjectInputStream
的创建需要ObjectOutputStream
创建后的一些数据,所以它一般在ObjectOutputStream
之前。创建好ObjectOutputStream
之后,还会先向流中先写入4个字节的数据,创建ObjectInputStream
的时候会相应的将其读出来,所以,不能多次创建ObjectOutputStream
,因为这会导致多次写入数据,
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。