最近在做项目的时候,遇到这样一个问题,如何判断 Socket 远程端连接是否关闭,如果关闭的话,就要重建连接Socket的类提供了一些已经封装好的方法, 如isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,在测试时发现,这些方法都是本地端的状态,无法判断远端是否已经断开连接。
其实在socket类中有一个方法sendUrgentData,它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节(在Java 中是抛出异常),而SO_OOBINLINE属性默认情况下就是关闭的。
以下是示例代码仅供参考:
public class Nksocket extends Thread{ public String ip=null;//连接服务器的IP public Integer port=null;//连接服务器的端口 private Socket socket=null;//套节字对象 private boolean close = false; // 关闭连接标志位,true表示关闭,false表示连接 private Integer sotimeout=1*1*10;//超时时间,以毫秒为单位 //------------------------------------------------------------------------------ public Nksocket(){ init(); } public Nksocket(String ip,Integer port){ setIp(ip); setPort(port); init(); } /** * 初始化socket对象 */ public void init(){ try { InetAddress address = InetAddress.getByName(getIp()); socket = new Socket(address,getPort()); socket.setKeepAlive(true);//开启保持活动状态的套接字 socket.setSoTimeout(sotimeout);//设置超时时间 close=!Send(socket,"2");//发送初始数据,发送成功则表示已经连接上,发送失败表示已经断开 }