多线程网络编程常见异常
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要做到“句句有回应”。
也有可能是因为在读序列化对象,序列化后的对象没有成功写入(或是漏掉了序列化接口的实现)。在进行相关操作时务必注意检查相关对象的状态。