七叶笔记 » java编程 » java判断socket是否连接

java判断socket是否连接

在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基础教程栏目。

相关文章