Java Socket常见异常处理

 在java网络编程Socket通信中 通常会遇到以下异常情况

 第 个异常是 BindException:Address already in use: JVM_Bind

 该异常发生在服务器端进行new ServerSocket(port)(port是一个 的整型值)操作时 异常的原因是以为与port一样的一个端口已经被启动 并进行监听 此时用netstat an命令 可以看到一个Listending状态的端口 只需要找一个没有被占用的端口就能解决该问题了

 第 个异常是 ConnectException: Connection refused: connect

 该异常发生在客户端进行 new Socket(ip port)操作时 该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由) 或者是该ip存在 但找不到指定的端口进行监听 出现该问题 首先检查客户端的ip和port是否写错 如果正确则从客户端ping一下服务器看是否能ping通 如果能ping通(服务器端把ping禁掉则需要另外的办法) 则看在服务器端的监听指定端口的程序是否启动 这个肯定能解决这个问题

 第 个异常是 SocketException: Socket is closed

 该异常在客户端和服务器均可能发生 异常的原因是本端主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作

 第 个异常是 SocketException: (Connection reset或者Connect reset by peer:Socket write error)

 该异常在客户端和服务器端均有可能发生 引起该异常的原因有两个 第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭) 另一端仍发送数据 发送的第一个数据包引发该异常(Connect reset by peer) 另一个是一端退出 但退出时并未关闭该连接 另一端如果在从连接中读数据则抛出该异常(Connection reset) 简单的说就是由连接断开后的读和写操作引起的

 第 个异常是 SocketException: Broken pipe

 该异常在客户端和服务器均有可能发生 在第 个异常的第一种情况中(也就是抛出 SocketExcepton:Connect reset by peer:Socket write error后) 如果再继续写数据则抛出该异常 前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接 其次是要检测对方的关闭连接操作 发现对方关闭连接后自己也要关闭该连接

 二.编写网络程序时需要注意的问题:

  是要正确区分长 短连接 所谓的长连接是指一经建立就永久保持 短连接的情况是 准备数据—>建立连接—>发送数据—>关闭连接 很多的程序员写了多年的网络程序 居然不知道什么是长连接 什么是短连接

  是对长连接的维护 所谓维护包括两个方面 首先是检测对方的主动断连(即调用 Socket的close方法) 其次是检测对方的宕机 异常退出及网络不通 这是一个健壮的通信程序必须具备的 检测对方的主动断连很简单 主要一方主动断连 另一方如果在进行读操作 则此时的返回值只 一旦检测到对方断连 则应该主动关闭本端的连接(调用Socket的close方法) 而检测对方的宕机 异常退出及网络不通 常用方法是用 心跳 也就是双方周期性的发送数据给对方 同时也从对方接收 心跳 如果连续几个周期都没有收到对方心跳 则可以判断对方宕机 异常退出或者网络不通 此时也需要主动关闭本端连接 如果是客户端可在延迟一定时间后重新发起连接 虽然Socket有一个keep alive选项来维护连接 如果用该选项 一般需要两个小时才能发现对方的宕机 异常退出及网络不通

lishixinzhi/Article/program/Java/hx/201311/26630