首页 >Java >Java基础 > 正文

java判断socket是否连接

原创2020-01-14 13:21:380815

在socket类中有一个方法sendUrgentData,它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节(在Java 中是抛出异常),而SO_OOBINLINE属性默认情况下就是关闭的。推荐:java视频教程

示例:

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知识请关注PHP中文网java基础教程栏目。

以上就是java判断socket是否连接的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码
  • 相关标签:java
  • 本文原创发布php中文网,转载请注明出处,感谢您的尊重!
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • javasocket服务端的方法:可以使用socket类中的sendUrgentData方法,该方法会向输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开
    javasocket开的方法:可以使用socket类中的sendUrgentData方法,通过Socket的SO_OOBINLINE属性有没有打开来,在java中会抛出异常。
    golang关闭的方法:1、通过recv()函数的返回值,返回值小于等于0时,socket开。
    java某张表存在的方法:1、使用JdbcTemplate查询来存在。2、使用Connection对象表来存在。
    swoole使用心跳机制fd,客户端定时发送一个心跳包,告诉服务器我还活着,服务器定时检测所有客户端列表,看他们最后一个心跳包的时间过长,如果过长,则认为已无心跳,定为死,主动关闭这个
    java为图片的方法:1、通过文件后缀名图片。2、通过文件头图片。3、通过MimetypesFileTypeMap来。4、通过ImageIO来
    java中文的方法:1、使用正则表达式"[\u4e00-\u9fa5]"中文。
    java为数字的方法:1、使用isDigit()方法指定字符串为数字。2、使用正则表达式为数字的正则表达式有"^[-\\+]?
    java想的的方法有:1、java中基本数据类型相等可以直使用“==”,相等返回true,不相等返回false。
    java空的方法:1、使用StringUtils.isEmpty(Object str)方法字符串或对象为空。2、使用isEmpty()方法数组或集合为空。
    java数组为空的方法:直使用if语句通过“array==null”数组为空,或使用“array.length==0”数组长度为0来数组为空。
    java对象为空的方法:1、使用org.apache.commons.lang包下的StringUtils
    java数组的方法:1、使用instanceof关键字数组。2、使用getClass()方法获取对象类型,通过对象类型为数组。
    java小数的方法:先将一串数字转化为字符串,然后使用contains(".")检查字符串中有小数点“.”即可小数。
    java小数的方法:可以将数字转化为string,然后使用contains()方法字符串中有小数点,若有小数,若无不小数。
    javamap为空的方法:可以利用isEmpty()函数来
    java字符串数字的方法:1、使用java中自带的方法Character.isDig(char ch)。2、使用正则表达式“-?[0-9]+(\\.[0-9]+)?”
    java字符串日期的方法:先指定日期格式,然后使用DateFormat类或者SimpleDateFormat类来正确的日期格式,来日期。
    java一个对象数组的方法:1、通过instanceof运算符一个对象数组。2、使用isArray()方法一个对象为数组。
    java可以使用正则表达式匹配汉字的unicode编码来一个字符汉字,java字符汉字的正则表达式为"[\u4e00-\u9fa5]"。

    专题推荐

    推荐视频教程
  • Java多线程与并发库高级应用视频教程Java多线程与并发库高级应用视频教程
  • 极客学院Java8新特性视频教程极客学院Java8新特性视频教程
  • Java游戏项目:拼图游戏的开发视频教程Java游戏项目:拼图游戏的开发视频教程
  • 最新Java完整视频教程最新Java完整视频教程
  • 视频教程分类