在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");//发送初始数据,发送成功则表示已经连接上,发送失败表示已经断开 }catch(UnknownHostException e) { e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } } /** * 读数据线程 */ public void run() { while(true){ //---------读数据--------------------------- close = isServerClose(socket);//判断是否断开 if(!close){//没有断开,开始读数据 String readtext = ReadText(socket); if(readtext!=null && readtext.trim().length()>0){ System.out.println("读取数据:"+readtext); } } //---------创建连接------------------------- while(close){//已经断开,重新建立连接 try{ System.out.println("重新建立连接:"+getIp()+":"+getPort()); InetAddress address = InetAddress.getByName(getIp()); socket = new Socket(address,getPort()); socket.setKeepAlive(true); socket.setSoTimeout(sotimeout); close = !Send(socket,"2"); System.out.println("建立连接成功:"+getIp()+":"+getPort()); }catch(Exception se){ System.out.println("创建连接失败:"+getIp()+":"+getPort()); close=true; } } } } /** * 发送数据,发送失败返回false,发送成功返回true * @param csocket * @param message * @return */ public Boolean Send(Socket csocket,String message){ try{ PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println(message); return true; }catch(Exception se){ se.printStackTrace(); return false; } } /** * 读取数据,返回字符串类型 * @param csocket * @return */ public String ReadText(Socket csocket){ try{ csocket.setSoTimeout(sotimeout); InputStream input = csocket.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(input)); char[] sn = new char[1000]; in.read(sn); String sc = new String(sn); return sc; }catch(IOException se){ return null; } } /** * 判断是否断开连接,断开返回true,没有返回false * @param socket * @return */ public Boolean isServerClose(Socket socket){ try{ socket.sendUrgentData(0xFF);//发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信 return false; }catch(Exception se){ return true; } } /** * 测试 * @param ags */ public static void main(String[] ags){ Nksocket nksocket = new Nksocket("127.0.0.1",8090); nksocket.start(); } //------------------------------------------------------------------------------ public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public Integer getPort() { return port; } public void setPort(Integer port) { this.port = port; } }
以上就是java判断socket是否连接的详细内容,更多请关注创新互联其它相关文章!