--------------------------------------------------------------------------------------------------------
4.java.net.SocketException:Socket is closed
该异常在客户端和服务器端都可能发生。异常的缘由是己方主动关闭了链接后
(调用了Socket的close方法)再对网络链接进行读写操做。
------------------------------------------------------------------------------
5.java.net.SocketException: Connection reset或者Connect reset by peer:Socket write error
该异常在客户端和服务器端均有可能发生,引发该异常的缘由有两个,
a. 第一个就是假如一端的Socket被关闭(或主动关闭或者由于异常退出而引发的关闭), 另外一端仍发送数据,发送的第一个数据包引起该异常(Connect reset by peer)。
b. 另外一个是一端退出,但退出时并未关闭该链接,另外一端假如在从链接中读数据则抛出该异常(Connection reset)。
简单的说就是在链接断开后的读和写操做引发的。 对于服务器,通常的缘由能够认为:
a) 服务器的并发链接数超过了其承载量,服务器会将其中一些链接主动Down掉.
b) 在数据传输的过程当中,浏览器或者接收客户端关闭了,而服务端还在向客户端发送数据。
----------------------------------------------------------------------------
6.java.net.SocketException: Broken pipe
该异常在客户端和服务器均有可能发生。在抛出SocketExcepton:Connect reset by peer:Socket write error后,假如再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭全部的网络链接,其次是要检测对方的关闭链接操做,发现对方 关闭链接后本身也要关闭该链接。
对于4和5这两种状况的异常,须要特别注意链接的维护。在短链接状况下还好,若是是长链接状况,对于链接状态的维护不当,则很是容易出现异常。
基本上对长链接须要作的就是:
a) 检测对方的主动断连(对方调用了Socket的close方法)。由于对方主动断连,另外一方若是在进行读操做,则此时的返回值是-1。因此一旦检测到对方断连,则主动关闭己方的链接(调用Socket的close方法)。
b) 检测对方的宕机、异常退出及网络不通,通常作法都是心跳检测。双方周期性的发送数据给对方,同时也从对方接收“心跳数据”,若是连续几个周期都没有收到对 方心跳,则能够判断对方或者宕机或者异常退出或者网络不通,此时也须要主动关闭己方链接;若是是客户端可在延迟必定时间后从新发起链接。虽然Socket 有一个keep alive选项来维护链接,若是用该选项,通常须要两个小时才能发现对方的宕机、异常退出及网络不通。
----------------------------------------------------------------------------------------------
7.java.net.SocketException: Too many open files
缘由: 操做系统的中打开文件的最大句柄数受限所致,经常发生在不少个并发用户访问服务器的时候。
由于为了执行每一个用户的应用服务器都要加载不少文件(new一个socket就须要一个文件句柄),这就会致使打开文件的句柄的缺少。
解决方式:
a) 尽可能把类打成jar包,由于一个jar包只消耗一个文件句柄,若是不打包,一个类就消耗一个文件句柄。
b) java的GC不能关闭网络链接打开的文件句柄,若是没有执行close()则文件句柄将一直存在,而不能被关闭。
也能够考虑设置socket的最大打开 数来控制这个问题。对操做系统作相关的设置,增长最大文件句柄数量。ulimit -a能够查看系统目前资源限制,ulimit -n 10240则能够修改,这个修改只对当前窗口有效。