最近在开发Zytter的对战系统时,我遇到了一个很奇怪的异常,这个异常就是EOFException
来几张图感受下:

首先是客户端报的Socket Closed(套接字已关闭)异常。游戏中出现了回合不同步的情况,这边已经完成了回合结算而另一边仍在等待对方行动。

检查服务器端,发现报了EOFException异常。这个异常是“流已经读至末尾”的标志,也就是说,流中已经没有任何数据可以传输了,抛出这个异常来提醒你连接已经关闭。
我就纳闷了,客户端的dos.writeInt(-1)语句才刚准备运行,就抛出了Socket Closed,而另一边反手就来一个EOFException
数据还没开始传,按理来说,服务器端的dis.readInt()不应该是阻塞的吗?
数据还没传过来就读到末尾?到底是哪边出的问题呢?
经过排查和之前的经验,一个方法让我顿时开朗。我知道罪魁祸首是谁了!
它就是:Thread.sleep(long)!!!!
重构了那部分的代码,在需要dis.writeInt(-1)的地方取消使用Thread.sleep(long),将Thread.sleep(long)放在一个新的线程中。
果不其然,完美运行,两端不再抛出异常。
总的来说,就是:使用dos.writeInt()前应尽量避免Thread.sleep()。