java中判断socket网络远端是否断开连接

详解modbus TCP通讯,并利用其实现欧姆龙PLC和西门子PLC的通讯 大家好,之前需要更新的MQTT通讯【2】因为硬件不足还不能发布出来,但最近在项目中涉及到西门子和欧姆龙之间的modbus TCP通讯,想到modbus TCP通讯是个非常常见并广泛使用的通讯协议,今天就结合最近做的测试给大家好好讲解一下,先提示一下,这边只给大家讲解如何实现,至于报文是什么,如何用socket来编写功能块或dll这边不会讲解,这块我会根据私信的小伙伴数量来考虑要不要出一篇如何用ST语言来编写modbus TCP功能块的博客。 阅读详情

原文:http://ivan4126.blog.163.com/blog/static/20949109220135284278806/

最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。

首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。

然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开。

最后又回到socket类,发现有一个方法sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的,太好了,正是我需要的!


java socekt 同步套节字编程主要用到java.net.Socket类,通常情况下我们需要socket的长连接模式。其次就是在连接的另一端断开之后需要及时响应。

对于连接的判断,socket提供的isClosed,isConnected等都是判断本地套节字的状态。要判断运程的连接,可以通过发送紧急数据来判断,紧急数据发送成功与否,就表示远程是否断开。


[java]  view plain copy
  1. public class Nksocket extends Thread{  
  2. public String ip=null;//连接服务器的IP  
  3. public Integer port=null;//连接服务器的端口  
  4. private Socket socket=null;//套节字对象  
  5. private boolean close = false; // 关闭连接标志位,true表示关闭,false表示连接  
  6. private Integer sotimeout=1*1*10;//超时时间,以毫秒为单位  
  7. //------------------------------------------------------------------------------  
  8. public Nksocket(){  
  9.    init();  
  10. }  
  11. public Nksocket(String ip,Integer port){  
  12.    setIp(ip);  
  13.    setPort(port);  
  14.    init();  
  15. }  
  16. /** 
  17. * 初始化socket对象 
  18. */  
  19. public void init(){  
  20.    try {  
  21.     InetAddress address = InetAddress.getByName(getIp());  
  22.     socket = new Socket(address,getPort());  
  23.     socket.setKeepAlive(true);//开启保持活动状态的套接字  
  24.     socket.setSoTimeout(sotimeout);//设置超时时间  
  25.     close=!Send(socket,"2");//发送初始数据,发送成功则表示已经连接上,发送失败表示已经断开  
  26.    }catch(UnknownHostException e) {  
  27.     e.printStackTrace();  
  28.    }catch(IOException e){  
  29.     e.printStackTrace();  
  30.    }  
  31. }  
  32. /** 
  33. * 读数据线程 
  34. */  
  35. public void run() {  
  36.    while(true){  
  37.     //---------读数据---------------------------  
  38.     close = isServerClose(socket);//判断是否断开  
  39.     if(!close){//没有断开,开始读数据  
  40.      String readtext = ReadText(socket);  
  41.      if(readtext!=null && readtext.trim().length()>0){  
  42.       System.out.println("读取数据:"+readtext);  
  43.      }  
  44.     }  
  45.     //---------创建连接-------------------------  
  46.     while(close){//已经断开,重新建立连接  
  47.      try{  
  48.       System.out.println("重新建立连接:"+getIp()+":"+getPort());  
  49.       InetAddress address = InetAddress.getByName(getIp());  
  50.       socket = new Socket(address,getPort());  
  51.       socket.setKeepAlive(true);  
  52.       socket.setSoTimeout(sotimeout);  
  53.       close = !Send(socket,"2");  
  54.       System.out.println("建立连接成功:"+getIp()+":"+getPort());  
  55.      }catch(Exception se){  
  56.       System.out.println("创建连接失败:"+getIp()+":"+getPort());  
  57.       close=true;  
  58.      }  
  59.     }  
  60.    }  
  61. }  
  62. /** 
  63. * 发送数据,发送失败返回false,发送成功返回true 
  64. * @param csocket 
  65. * @param message 
  66. * @return 
  67. */  
  68. public Boolean Send(Socket csocket,String message){  
  69.    try{  
  70.     PrintWriter out = new PrintWriter(socket.getOutputStream(), true);  
  71.     out.println(message);  
  72.     return true;  
  73.    }catch(Exception se){  
  74.     se.printStackTrace();  
  75.     return false;  
  76.    }  
  77. }  
  78. /** 
  79. * 读取数据,返回字符串类型 
  80. * @param csocket 
  81. * @return 
  82. */  
  83. public String ReadText(Socket csocket){  
  84.    try{  
  85.     csocket.setSoTimeout(sotimeout);  
  86.     InputStream input = csocket.getInputStream();  
  87.     BufferedReader in = new BufferedReader(new InputStreamReader(input));  
  88.     char[] sn = new char[1000];  
  89.     in.read(sn);  
  90.     String sc = new String(sn);  
  91.     return sc;  
  92.    }catch(IOException se){  
  93.     return null;  
  94.    }  
  95. }  
  96. /** 
  97. * 判断是否断开连接,断开返回true,没有返回false 
  98. * @param socket 
  99. * @return 
  100. */  
  101. public Boolean isServerClose(Socket socket){  
  102.    try{  
  103.     socket.sendUrgentData(0);//发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信  
  104.     return false;  
  105.    }catch(Exception se){  
  106.     return true;  
  107.    }  
  108. }  
  109. /** 
  110. * 测试 
  111. * @param ags 
  112. */  
  113. public static void main(String[] ags){  
  114.    Nksocket nksocket = new Nksocket("127.0.0.1",8089);  
  115.    nksocket.start();  
  116. }  
  117. //------------------------------------------------------------------------------  
  118. public String getIp() {  
  119.    return ip;  
  120. }  
  121. public void setIp(String ip) {  
  122.    this.ip = ip;  
  123. }  
  124. public Integer getPort() {  
  125.    return port;  
  126. }  
  127. public void setPort(Integer port) {  
  128.    this.port = port;  
  129. }  
  130. }  

【100%通过率】华为OD机试真题 Python 实现【打印机队列】【2022.11 Q4 新题】 有5台打印机打印文件,每台打印机有自己的待打印队列。因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的代先级,其中数字越大优先级越高。打印机会从自己的待打印队列中选择优先级最高的文件来打印。如果存在两个优先级一样的文件,则选择最早进入队列的那个文件。现在请你来模拟这5台打印机的打印过程。 阅读详情

相关推荐

ESP32-C5 Wi-Fi CSI感知技术原理与工程实践

Wi-Fi信道状态信息(CSI)是OFDM系统中反映多径信道特性的复数频域响应,源于导频子载波的信道估计过程,本质属于物理层原始观测数据。其高维度(如56子载波)、高时间分辨率(百赫兹级采样)及零硬件增益的特性,使其成为无感人体感知的理想信号源。相比UWB或毫米波雷达,CSI方案依托现有Wi-Fi基础设施,兼具成本优势与部署灵活性,广泛应用于呼吸监测、跌倒检测、手势识别等边缘智能场景。乐鑫ESP32-C5通过5.8GHz低噪接收、亚纳秒级多天线同步与固件级CSI增强,显著提升微动感知鲁棒性,结合AGC锁定、

weixin_42153793的博客 343

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

如何判断 Socket 远程端连接是否关闭,如果关闭的话,就要重建连接Socket的类提供了一些已经封装好的方法, 如 isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,在测试时发现,这些方法都是本地端的状态,无法判断远端是否已经断开连接。

猿大师 3177

华为ENSP虚拟网络与本地物理网卡高效桥接实战指南

本文提供了一份详细的华为ENSP虚拟网络与本地物理网卡桥接实战指南。通过清晰的四步操作,帮助用户打破虚拟实验环境的“孤岛”限制,实现ENSP设备与真实局域网及互联网的互通,从而进行更真实的协议测试、软件升级和混合网络环境搭建。

qsc90123456的博客 537

java Socket判断对方是否已关闭连接

如何判断远端socket是否已经断开连接,如果断开那么需要重新连接。 1通过socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,这些方法都是本地端的状态,无法判断远端是否已经断开连接。 2通过OutputStream发送心跳消息,如果发送失败就表示远端已经断开连接,类似

B_H_L的专栏 1万+

星空组网 vs 蒲公英 vs Tailscale:2024年国内免费异地组网工具横评(含实测数据)

本文对2024年国内主流免费异地组网工具星空组网、蒲公英和Tailscale进行了深度横向评测。基于实测数据,重点分析了三者在P2P成功率、中继延迟、传输速度及稳定性方面的表现,为中小企业、远程办公及个人开发者提供了清晰的选择指南。星空组网在国内网络环境下展现出优秀的平衡性。

weixin_29217235的博客 1439

k8s部署 普罗米修斯(Prometheus)监控

Prometheus是一个开源的服务监控系统和时序数据库其提供了通用的数据模型和快捷数据采集、存储和查询接口它的核心组件Prometheus服务器定期从静态配置的监控目标或者基于服务发现自动配置的目标中进行拉 取数据新拉取到啊的 数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。

D2961953033的博客 3854

Python TCP 协议网络编程《一》

TCP协议介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP) TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。 TCP通信需要经过创建连接、数据传送、终止连接三个步骤。 TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话",而UDP类似于生活中的"发短信"。 TCP三次握手 首先Client(客户)端发送连接请求报文(第一次握手)。 .

Python+大数据+数据分析+自动化+Vue组件开发 274

Windows 10 下 Nacos 3.0.2 单机版保姆级安装教程(含JDK 17配置与MySQL 8.0连接避坑)

本文提供Windows 10下Nacos 3.0.2单机版的详细安装教程,涵盖JDK 17配置、MySQL 8.0连接优化及生产级安全设置。通过步骤详解和常见问题解决方案,帮助开发者快速完成Nacos的安装与配置,确保服务发现与配置管理的高效运行。

weixin_29237635的博客 319

金秋十月重磅技术文——网络编程大揭秘

目录 1、网络编程的基本概念 2、IP地址及端口号 3、通信协议 4、TCP通信代码实践 4.1消息传递 4.2文件上传 5、UDP通信代码实践 5.1 UDP实现消息发送 5.2 使用UDP循环发送和接收消息 5.3使用UDP实现聊天 1、网络编程的基本概念 引例 在学习网络编程之前,我们先看这样一个例子。一般处于我们这个年龄段的同学,大都经历过写信/寄信的经历,在写信的时候,我们一般都需要明确发送的地址、联系人信息以及所在地区的邮编,邮递员可以根据这上面的信息找到接

Java0258的博客 354

【低空经济】森林火情高精度监测与早期预警无人机巡护方案

在全球范围内,森林火灾已成为一个严重的生态和社会问题。它不仅对自然生态系统造成了毁灭性的影响,还对人类的生命财产安全构成了极大的威胁。根据国际森林发展组织的统计,全球每年因森林火灾造成的经济损失高达数百亿美元,甚至在某些年份,火灾损失占到某些国家国民经济总量的相当一部分。因此,开展高效的森林火情监测与早期预警工作显得尤为重要。随着科技的发展,无人机作为新兴的监测工具,以其高效、灵活和经济的特点在森林火灾监测领域展现出了巨大的潜力。

2502_92579126的博客 1212

AWS RDS 介绍 三)创建 RDS 实例

AWS RDS 介绍 共分为 7 个部分, 其中 第 3部分重点介绍,如何创建一个RDS 实例。 三) AWS RDS 试用MySQL http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.

XuYongshi02的专栏 7646

java 判断tcp连接断开连接_网络通信之检测远端连接是否断开连接

判断对方是否断开连接:一、方法层面的实现:1,使用输入流的read方法:输入流的read(byte[] ,int ,int) 方法,表示从当前的通道中读取数据,具体读取到的数据有返回的int值决定;这里的返回值和抛出的异常很重要,如果抛出IOException异常,很明显连接已经断开;返回值说明:针对于基于tcp/ip协议的socket连接说明:如果没有设置socket的soTimeout属性,那...

weixin_33835558的博客 2042

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java中判断socket网络远端是否断开连接(转)

最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。 首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。 然后想到是否可以通过Output

618

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【Socket】java中判断socket网络远端是否断开连接

文章来源:http://hi.baidu.com/lixiaoqing18/blog/item/fc9a66d30109b8dba9ec9a0a.html                 最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。       首先想到socket类的方法isClosed()、isConnected()、isInputSt...

cfy_zybing的专栏 238

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java sendUrgentData_socket.sendUrgentData判断网络远端是否断开连接

最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。然后想到是否可以通过OutputStream发送...

weixin_35691715的博客 462

java中判断socket服务器端是否断开连接

最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。 首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。 然后想到是否可以通过OutputStre

清闲的专栏 8167

Java Socket判断远端网络断开

首先介绍一下我的平台和应用环境。我使用的硬件平台是友善之臂Micro2440,软件平台是Embedded Linux,kernel版本是2.6.32,使用的java语言。 可能大家知道在使用Java Socket编程的时候经常要检测网络是不是完好连接的。比如Socket服务器检测和客户端的连接是否已经断开。首先想到socket类的方法isClosed()、isConnected()、isInpu

Baple的专栏 1万+

java socket 客户端断开连接_java中判断socket服务器端是否断开连接

最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。然后想到是否可以通过OutputStream发送...

weixin_30296995的博客 2704

java socket 断线重连_【转】java中判断socket服务器端是否断开连接

/** * 才疏学浅,现在只能是照搬书上的例子。 这个重在理解客户端与服务器端的交互。 /** * */package test1;import java.awt.BorderLayout;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import ja最近在开发...

weixin_42640676的博客 1653

java判断socket是否断开

首先 socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。 然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会...

tao_wei162的博客 1783

java socket 对方关闭_java Socket判断对方是否已关闭连接

如何判断远端socket是否已经断开连接,如果断开那么需要重新连接。1通过socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()等,这些方法都是本地端的状态,无法判断远端是否已经断开连接。2通过OutputStream发送心跳消息,如果发送失败就表示远端已经断开连接,类似ping,远端需...

weixin_32899267的博客 1031
上一篇: java socket服务端一些理解
下一篇: 16进制位运算
极客效率局
博客等级 码龄14年 442粉丝 214原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值