JAVA 判断Socket 远程端是否断开连接

JAVA 判断Socket 远程端是否断开连接

最近在做项目的时候,遇到这样一个问题,如何判断 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");//发送初始数据,发送成功则表示已经连接上,发送失败表示已经断开 }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; 
} 
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axure 内部框架内容下滑_Axure教程:转盘抽奖交互原型

本文跟大家分享,如何使用axure制作转盘抽奖交互原型,不带登录流程。效果如下:抽奖流程一、主要内容(1)主要元件:动态面板(2)重点:旋转交互、随机函数、触发动作。(3)难点:通过停止位置判断抽奖结果(4)涉及函…

java.lang.relect.Array 类

概述 这是一个位于 java.lang.reflect 包下的类,类中的方法都是静态方法,主要的功能就是更方便地创建数组。在数组元素类型未知时,简化了操作数组的代码。 使用示例 //创建一个长度为 5 的整形数组 //等价于 int[] array new int[4]; int…

日志打印的8种级别(很详细)

日志打印的8种级别(很详细) 日志的输出都是分级别的,不同的设置不同的场合打印不同的日志。下面拿最普遍用的Log4j日志框架来做个日志级别的说明,其他大同小异。 Log4j的级别类org.apache.log4j.Level里面定义了日志级别&#x…

python格式字符_python格式字符

用python实现接口测试(八、实现序列化与反序列化)前言在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象。一、字典,通过json把它序列…

CountDownLatch 介绍与举例实现

文章目录概述主要方法举例实现概述 CountDownLatch 是 JUC 包下的一个重要的并发工具,它是一个线程协同作业的工具,使某些线程一直处于等待状态,直到另外的线程完成任务后再执行。 主要方法 CountDownLatch 主要靠内部的一个计数器来实现同…

identity_insert 如何改为on_十分钟教你如何快速提高Laya构建速度,还不快来康康?...

前言如何快速提高Laya构建速度 微信小游戏推出之后,很多公司也相应的进入到微信小游戏这个领域,现在市场上的游戏开发引擎,如Cocos、Egret、Laya都对小游戏有了很好的兼容性。而在实际开发中,如何提高Laya的构建速度,是…

mysql数据库中数据类型的长度

mysql数据库中数据类型的长度 在mysql中新建数据表的时候会有长度一说,其实用建表语句建数据表的时候也有涉及 例如: CREATE TABLE user( uid int(4), name varchar(255), passward varchar(20) birthday data ) 不知道你有没有注意这个数据类型…

Iterator 和 ListIterator 的区别

概述 Iterator 和 ListIterator 都是迭代器,都可以用来遍历 List,ListIterator 还继承自 Iterator。 区别 Iterator 只能用于顺序遍历,且只能删除元素ListIterator 可以顺序或者反序遍历ListIterator 可以增加(add(E e) 方法&a…

二下语文书电子课本_小学生语文成绩好,不是靠补课,把课本吃透,才是高效学习方法...

关注语文教学发展,解决语文学习困惑。对于基础差、语文学习能力差的同学,我不建议去补课。但是家长说,不补课怎么办呢?我们也没有时间和耐心去给孩子辅导,又怕讲错了,还是让老师讲好。尽管家长们有这个意识…

Java面试——MyBatis系列总结

文章目录: 1.MyBatis是什么? 2.JDBC编程有哪些缺陷?MyBatis又是如何改进的? 3.MyBatis与Hibernate的区别在哪? 4.MyBatis的优缺点 5.请说说MyBatis的工作原理 6.MyBatis的架构设计是怎样的? 7.#{}和…

包装类型与基本类型的装箱与拆箱操作

文章目录概述Boolean 与 booleanCharacter 与 charByte 与 byteShort 与 shortInteger 与 intFloat 与 floatDouble 与 doubleLong 与 long总结概述 基本类型与包装类型,存在相互转化的关系。 基本类型转为包装类型这个过程,被称之为装箱包装类型转为基…

机器人炒饭小块头一一_小块头机器人炒饭:全智能流程,炒饭芬芳独具

在我的生活里,没有什么不开心的事情是一顿炒饭解决不了的,实在不行就两顿。把前一天剩出来的隔夜饭放到锅里和家里的食材进行组合、翻炒,就可以千变万化,方便好吃又管饱。小块头茶油炒饭,是一份易拉罐材质独立包装的炒…

Java面试——Spring系列总结

文章目录: 1.什么是Spring? 2.Spring由哪些模块组成? 3.Spring中都用到了哪些设计模式? 4.什么是Spring IOC容器?有什么作用? 5.Spring IoC的实现机制 6.BeanFactory 和 ApplicationContext有什么区别…

gateway 过滤器执行顺序_spring boot gateway 过滤器的执行顺序

前言学习官方文档,发现对于过滤器有分为三类默认过滤器自定义过滤全局过滤器于是就有一个疑问,关于这些过滤器的访问顺序是怎样的,今天就以一个demo来进行测试准备阶段过滤器工厂类以此为模板,复制出几份就可以了,注意…

Java 线程状态流转

Java 线程一共有 6 种状态: NEW:新建状态,当一个线程被创建完成,还没有调用 start() 方法时,是这种状态。RUNNABLE:可运行状态,当一个线程正在正常地执行 run() 中的代码时,是这种状…

达梦数据库导入oracle数据_达梦数据库和oracle数据的一些区别

近期我在考达梦的dca发现有一些和oracle不同的地方,由于我是oracleDBA在维护达梦数据库的时候有需要注意的地方,现在分享一下2个数据库的一些区别。1、登陆的区别oracle:如果sys的密码忘记可以用操作系统验证方式登陆修改密码。dm:达梦数据库如果忘记了s…

Fail-fast 和 Fail-safe 机制

fail-fast 和 fail-safe 的区别 从字面意思来看 fail-fast 是快速失败,fail-safe 是安全失败,这都是集合类对于并发读写时的一种应对机制。 fail-fast,广泛应用于 java.util 下的集合类中,其机制为在使用迭代器遍历的过程中&…

【java8新特性】——lambda表达式与函数式接口详解(一)

一、简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式、函数式接口、方法引用、默认方法、新工具(编译工具)、Stream API、Date Time API、Optional等 。 当前很多公司的老产品依然使用的…

详解 ConcurrentHashMap

文章目录ConcurrentHashMap 的底层数据结构?ConcurrentHashMap 的带参构造方法的流程?ConcurrentHashMap 的 put 方法的流程?ConcurrentHashMap addCount 方法的流程是怎样的呢?ConcurrentHashMap transfer 方法的流程是怎样的呢?Concurren…

js 二叉树图形_js数据结构和算法(三)二叉树

二叉树的概念二叉树(Binary Tree)是n(n>0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。二叉树的特点每个结点最多有两棵子树,所以二叉树中不存在度大于…