最近弄socket 流程是 主项目保持一个单例客户端socket类 在执行一些操作的时候通过此客户端socket通知服务器 如下
package com.common.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class UtilSocket {
private static final UtilSocket INSTANCE = new UtilSocket();
private final String host = "192.168.1.201";
private final int port = 4321;
private BufferedReader socketReader;
private PrintWriter socketWriter;
private Socket client = null;
private UtilSocket() {
connServer();
System.out.println("构造UtilSocket!");
}
public static UtilSocket getInstance() {
if(INSTANCE.client == null || INSTANCE.client.isClosed()){
INSTANCE.downServer();
INSTANCE.connServer();
}
return INSTANCE;
}
//链接远程服务器
public void connServer() {
try {
client = new Socket(host,port);
socketReader = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
socketWriter = new PrintWriter(client.getOutputStream(),true);
} catch(UnknownHostException e) {
System.out.println("Error1 setting up socket connection: unknown host at "+host+":"+port);
} catch(IOException e) {
System.out.println("Error2 setting up socket connection: "+e);
}
}
//断开远程服务器
public void downServer() {
try {
socketWriter.close();
socketReader.close();
client.close();
}catch(IOException e) {
System.out.println("Error tearing down socket connection: "+e);
}
}
//向服务器通知内容
public void putInfo(String str) {
try {
socketWriter.println(str);
}
catch(Exception e) {
System.out.println("Error reading from file: "+str);
}
}
}
测试之后问题出现了
socket服务器不重启 主项目重启没问题 但是socket服务器重启 主项目不重启的话 发出的socket请求 socket服务器完全接收不到信息。
仔细推敲后发觉是socket服务器已经断开 而主项目这边完全不知道,如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。
首先想到socket类的方法isClosed()、isConnected()、isInputStreamShutdown()、
isOutputStreamShutdown()等,但经过试验并查看相关文档,这些方法都是本地端的状态,无法判断远端是否已经断开连接。
然后想到是否可以通过OutputStream发送一段测试数据,如果发送失败就表示远端已经断开连接,类似ping,但是这样会影响到正常的输出数据,远端无法把正常数据和测试数据分开。
最后google了一把 发现有篇文章写的问题与我遇到的一模一样
使用sendUrgentData,查看文档后得知它会往输出流发送一个字节的数据,只要对方Socket的SO_OOBINLINE属性没有打开,就会
自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的。
然后把取得实例的方法修改了一下 问题解决! (~ o ~)~zZ
public static UtilSocket getInstance() {
if(INSTANCE.client == null || INSTANCE.client.isClosed()){
INSTANCE.downServer();
INSTANCE.connServer();
}
try{
INSTANCE.client.sendUrgentData(0xFF);
}catch(Exception ex){
System.out.println("远程服务器断开!重联!");
INSTANCE.downServer();
INSTANCE.connServer();
}
return INSTANCE;
}
分享到:
- 2008-11-12 16:30
- 浏览 1850
- 评论(1)
- 论坛回复 / 浏览 (1 / 4354)
- 查看更多
相关推荐
实现SOCKET TCP断开连接后,重新连接 比如TCP通信过程中,网断了或者拨了网线,如何在代码中自动重新连接TCP服务器.这是常见需求
为了解决这一问题,技术人员改变了接线方式,确保了无线重联设备级位信号线的独立接地,从而有效地解决了牵引电流自动卸载的问题。 另一个常见的故障是主从车不同步现象。从控机车可能会在主控机车升弓后出现异常的...
标题中的“基于PLC的变频牵引机车重联控制系统”指的是使用可编程逻辑控制器(PLC)技术来实现多台变频牵引机车的重联控制,以提高隧道施工中物料运输的能力和效率。这一系统的设计旨在解决随着隧道施工速度加快,对...
在现代化铁路运输体系中,机车的重联操作是提高运输效率和保证行车安全的重要环节。XX机务段针对不同车型,尤其是DF4D型内燃机车及其升级版本DF4D3000号高速客运型内燃机车,制定了一系列详尽的重联操作步骤,旨在...
磁场重联中电子加速问题的物理分析和数值研究,丁健,李毅,观测表明耀斑中电子加速发生在软X射线耀斑环上方的磁重联区域。在重联电流片中被super-Dreicer电场直接加速看起来似乎是产生能量在10ke
【标题】:“开发技术-硬件-日冕大尺度结构演化及快速磁场重联的数” 在日冕物理学中,太阳大气层的最外层——日冕,是一个充满神秘与复杂性的领域。研究日冕大尺度结构的演化以及快速磁场重联是理解太阳活动和空间...
3. **TCP断线重联**:在TCP通信中,由于网络问题或设备故障,连接可能会中断。为保证服务的连续性,客户端需要有断线后自动重连的机制。这通常涉及到心跳检测和异常处理。在Qt中,我们可以通过监听QTcpSocket的...
Stenzel等人通过实验研究了电子磁流体中的磁场重联现象,观察到大的径向电子压强梯度和电子加热现象。这些实验现象进一步表明电子压强梯度在电子磁流体中的磁场重联中扮演了重要的角色。 在理论研究方面,研究者们...
在探讨“防爆重联蓄电池电机车斩波调速改造”时,我们首先要了解防爆重联蓄电池电机车的工作原理以及为何需要斩波调速。防爆重联蓄电池电机车广泛应用于煤炭矿山等领域,由于煤矿等区域的气体和粉尘的特殊性,电机车...
数据挖掘技术在机车无线重联故障诊断中的应用.pdf
行业资料-交通装置-一种基于重联硬线失电实现机车紧急制动的电路.zip
由于农业银行的银企业直联功能提供的的服务是SOCKET,不提供HTTP调用方式。但当前SAP不支持SOCKET,所以就在前置机上做了一个TOMCAT服务,使用JAVA开发,把农银的SOCKET转换为HTTP提供出来,以方便SAP使用,然后SAP...
行业资料-交通装置-一种内燃机车重联牵引传动装置.zip
行业资料-交通装置-一种基于RTLS的机车无线重联方法与系统.zip
行业资料-交通装置-一种基于PAC控制器的CAN总线机车重联系统.zip
重庆邮电大学网络自动连接,有时莫名其妙断网后会自动重连。运行时确保exe文件和config.json文件在同一目录下。config中需要配置自己的账号和密码,isTelecom配置为电信还是移动。配置isPC : false,可以使得电脑模拟...
行业资料-交通装置-一种基于无线宽带通信的非网络化机车无线重联控制装置.zip
在实际应用中,由于网络问题、服务器维护或其他不可预知的因素,数据库连接可能会中断。在这种情况下,一个健壮的系统需要具备自动重连功能,以便在连接丢失后能够快速恢复服务。这通常涉及到心跳检测、连接池管理和...