阻塞Socket 和非阻塞Socket
一是阻塞函数,一是非阻塞函数。所谓阻塞函数,是指其完成指定的任务之前不允许程序调用另一个函数,在Windows 下还会阻塞本线程消息的发送。所谓非阻塞函数,是指操作启动之后,如果可以立即得到结果就返回结果,否则返回表示结果需要等待的错误信息,不等待任务完成函数就返回
常见socket 异常
java.net.BindException:Addressalready in use:JVM_Bind。该异常发生在服务器端进行new ServerSocket(port(port 是一个0,65536的整型值)操作时。异常的原因是以为与port 一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending 状态的端口。只需要找一个没有被占用的端口就能解决这个问题。java.net.ConnectException:Connection refused:connect 。该异常发生在客户端进行new Socket(ip,port 操作时,该异常发生的原因是或者具有ip 地址的机器不能找到(也就是说从当前机器不存在到指定ip 路由),或者是该ip 存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip 和port 是否写错了,如果正确则从客户端ping 一下服务器看是否能ping 通,如果能ping 通(服务服务器端把ping 禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。
java.net.SocketException:Socket is closed ,该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket 的close 方法)再对网络连接进行读写操作。
java.net.SocketException:(Connection reset 或者Connect reset by
peer:Socketwrite error )。该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket 被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connectreset by peer 。另一个是一端退出,但退出时并未关闭该连接,另一端如
果在从连接中读数据则抛出该异常(Connection reset )。简单的说就是在连接断开后的读和写操作引起的。
常见原因:
①:服务器的并发连接数超过了其承载量,服务器会将其中一些连接Down 掉;
②:客户关掉了浏览器,而服务器还在给客户端发送数据; ③:浏览器端按了Stop
引起该问题的原因是由于此时Server 端连接已经被复位,而Client 依然通过该连接在接收和发送数据,该错误引起的原因大都是防火墙的原因,这是网络连接断掉引起的,一般是由于通过了防火墙,而防火墙一般都会有超时的机制,在网络连接长时间不传输数据时,会切断这个TCP 的session ,这时就会导致Connection reset by peer error
java.net.SocketException:Broken pipe 。该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出SocketExcepton:Connectreset by peer:Socketwrite error 后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。