网络编程Bug留念:java.net.SocketException 以及 java.io.EOFException

java.net.SocketException

指创建或访问套接字时发生错误。

一些常见的SocketException

通信冲突

java.net.SocketException: Software caused connection abort: socket write error

java.net.SocketException: Socket is closed

java.net.SocketException: Connection reset

java.net.SocketException: Connect reset by peer:Socket write error

异常原因

这些异常在客户端和服务器端都有可能发生,原因通常由服务器端与客户端的通信冲突引发的,其中有很多可能,比如:
一方的Socket已经关闭(主动或异常),另一方仍向它发送数据;
一方退出时未关闭连接,另一方误以为连接还在,试图继续在连接中读取数据;
在没有使用多线程的情况下,当前线程还未关闭,就再次连接了下一个线程;
连接空闲时间过长,自动断开了连接;
……

解决方式

在连接中读取\发送数据前,提前确认连接是否依然完好;
该关闭连接时,及时关闭连接;
活用finally()方法,在操作完当前线程欲连接下一个线程时,务必及时关闭当前线程及相关流;
……

连接错误

java.net.BindException:Address already in use: JVM_Bind

异常原因:端口号已经被占用
解决方式:换一个端口号

java.net.SocketException: Connection refused: connect

异常原因:通常在new Socket(ip,port)的时候发生。找不到ip地址,或是找不到端口。
解决方式:若确定拼写无误,使用ping命令检查一下服务器,或是检查端口的程序。

java.io.EOFException

EOF是文件结束符,Linux中会经常用到。该异常文件已经到了结尾,不能再继续读了。

异常原因及解决方法

有可能是因为一端在等着readObject(),但是另一端并没有写入的操作。在一些条件语句中可能经常因逻辑不严谨犯这种错误(比如,菜单逻辑里的退出\返回操作中),值得警惕。在写客户端和服务器端的通信时,对readObject()和writeObject要做到“句句有回应”。
也有可能是因为在读序列化对象,序列化后的对象没有成功写入(或是漏掉了序列化接口的实现)。在进行相关操作时务必注意检查相关对象的状态。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页