java.net.SocketException如何才能更好的使用呢?这个就须要咱们先要了解有关这个语言的相关问题。但愿你们有所帮助。那么咱们就来看看有关java.net.SocketException的相关知识。java
第1个异常是 java.net.BindException:Address already in use: JVM_Bind。程序员
该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操做时。异常的缘由是觉得与port同样的一个端口已经被启动,并进行监听。此时用netstat –an命令,能够看到一个Listending状态的端口。只须要找一个没有被占用的端口就能解决这个问题。服务器
第2个异常是java.net.SocketException: Connection refused: connect。网络
该异常发生在客户端进行 new Socket(ip, port)操做时,该异常发生的缘由是或者具备ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,若是正确则从客户端ping一下服务器看是否能ping通,若是能ping通(服务服务器端把ping禁掉则须要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个确定能解决这个问题。.net
第3个异常是java.net.SocketException: Socket is closed,线程
该异常在客户端和服务器都可能发生。异常的缘由是己方主动关闭了链接后(调用了Socket的close方法)再对网络链接进行读写操做。设计
第4个异常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。htm
该异常在客户端和服务器端均有可能发生,引发该异常的缘由有两个,第一个就是若是一端的Socket被关闭(或主动关闭或者由于异常退出而引发的关闭),另外一端仍发送数据,发送的第一个数据包引起该异常(Connect reset by peer)。另外一个是一端退出,但退出时并未关闭该链接,另外一端若是在从链接中读数据则抛出该异常(Connection reset)。简单的说就是在链接断开后的读和写操做引发的。ip
第5个异常是java.net.SocketException: Broken pipe。路由
该异常在客户端和服务器均有可能发生。在第4个异常的第一种状况中(也就是抛出 SocketExcepton:Connect reset by peer:Socket write error后),若是再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭全部的网络链接,其次是要检测对方的关闭链接操做,发现对方关闭链接后本身也要关闭该链接。
编写网络程序时须要注意的问题
第1个问题是要正确区分长、短链接。所谓的长链接是一经创建就永久保持。短链接就是在如下场景下,准备数据—>创建链接— >发送数据—>关闭链接。不少的程序员写了多年的网络程序,竟然不知道什么是长链接,什么是短链接。
第2个问题是对长链接的维护。所谓的维护包括两个方面,首先是检测对方的主动断连(既调用 Socket的close方法),其次是检测对方的宕机、异常退出及网络不通。这是一个健壮的通讯程序必须具有的。检测对方的主动断连很简单,主要一方主动断连,另外一方若是在进行读操做,则此时的返回值只-1,一旦检测到对方断连,则应该主动关闭己方的链接(调用Socket的close方法)。
而检测对方的宕机、异常退出及网络不一般用方法是用“心跳”,也就是双方周期性的发送数据给对方,同时也从对方接收“心跳”,若是连续几个周期都没有收到对方心跳,则能够判断对方或者宕机或者异常推出或者网络不通,此时也须要主动关闭己方链接,若是是客户端可在延迟必定时间后从新发起链接。虽然Socket有一个keep alive选项来维护链接,若是用该选项,通常须要两个小时才能发现对方的宕机、异常退出及网络不通。
第3个问题是处理效率问题。不论是客户端仍是服务器,若是是长链接一个程序至少须要两个线程,一个用于接收数据,一个用于发送心跳,写数据不须要专门的线程,固然另外还须要一类线程(俗称Worker线程)用于进行消息的处理,也就是说接收线程仅仅负责接收数据,而后再分发给Worker进行数据的处理。若是是短链接,则不须要发送心跳的线程,若是是服务器还须要一个专门的线程负责进行链接请求的监听。这些是一个通讯程序的总体要求,具体怎么设计你的程序,就看你本身的设计水平了。