`

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

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

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

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

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

于是,下面一段代码就可以判断远端是否断开了连接:

try{
      socket.sendUrgentData(0xFF);
}catch(Exception ex){
      reconnect();
}

用ping实现

package com.csdn.test;
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStreamReader;
  public class test {
  static BufferedReader bufferedReader;
  public static void main(String[] args) throws IOException {
  try {
  Process process = Runtime.getRuntime().exec("ping 192.168.1.104");//判断是否连接的IP;
  bufferedReader = new BufferedReader(new InputStreamReader(process
  .getInputStream()));
  String connectionStr = "";
  while ((connectionStr = bufferedReader.readLine()) != null) {
  System.out.println(connectionStr);
  }
  } catch (IOException e) {
  e.printStackTrace();
  } finally {
  bufferedReader.close();
  }
  }
  }

ping的方法有个严重的BUG,就是你只能判断对方是否连接网络,而不能判断客户端是否开启...

我在写聊天室时经常要注意客户端异常退出的问题(比如客户直接调用任务管理器结束程序进程),

其实在通过socket.getoutstream和socket.getinputstream流对客户端发送、接受信息时如果socket没连接上是会抛出异常的,这也就是为什么Java会要求网络编程都要写在try里面,所以只要在catch里面写入客户端退出的处理就行了,没必要专门去想什么方法
分享到:
评论

相关推荐

    Socket服务器端断开后重新打开,客户端将自动完成链接

    Socket通信技术。利用到了Thread技术,完成了,服务器开启,一直监听客户端功能,两点是,当服务器端断开后重新打开后,客户端能自动链接到服务器端,由于网络原因最多延迟2分钟

    基于java socket使用tcp udp进行简易控制台命令与文件传输

    2) 基于Java Socket TCP和UDP实现一个简易的网络文件服务程序,包含服务器端FileServer和客户端FileClient; 3) 服务器端启动时需传递root目录参数,并校验该目录是否有效; 4) 服务器启动后,开启TCP:2021端口,...

    基于java实现Socket套接字一对一聊天系统源码+项目说明.zip

    3. 适合客户端和服务器端之间信息实时交互 4. 传输数据为字节级,传输数据可自定义,数据量小 ## 1.3 缺点 相对于http协议传输,增加了开发量 服务端 1. **创建Socket,bind()绑定地址,listen()监听套接字** ...

    基于Socket套接字消息推送系统

    服务器端使用java,客户端使用Android。本人是做Android开发的,所以demo重点介绍客户端的一些代码,包括Socket的TCP长连接及发消息,Service如何不被轻易杀死,通过aidl实现界面实时与Service的通信,可以在界面上...

    Socket TCP通信.zip

    C++多线程Socket TCP通信源码附带说明文档,编译环境为VS2013,可以实现服务器端和客户端的任意收发,同时能够完成四次挥手的过程,双发均可以主动断开连接。

    Socket编程实验报告.docx

    实验报告 实验一 Socket编程 一、实验目的 通过socket程序的编写、调试,掌握socket编程的基本方法,了解客户端与服务器端的特点,掌握并熟悉运用socket类与ServerSocket类。 实验内容 学习socket编程使用的类和接口...

    基于Socket的多客户端网络聊天系统的开发与设计

    服务器端应当建立一个ServerSocket,用于不断进行侦听客户端是否有连接请求或者断开连接。服务器端就是一个管理信息发送的控制中心;客户端要想进行信息的传递,首先必须先将信息发送至服务器端,然后服务器再根据...

    网络编程课程设计报告-Android-Socket-聊天室.doc

    (2)连接(Android 创建Socket会自动连接) (3)与服务器端进行通信 (4)关闭套接字 四、系统流程图 五、系统设计 本课程设计按照系统的具体功能要求,首先应用Socket编程创建客户端和服务器端, 每多个客户端服务器端...

    可群发,冒号加客户号可指定用户发送的java聊天程序

    outputS.writeObject("服务器:你已和服务器断开连接"); this.inputS.close(); this.outputS.close(); this.connection.close(); connections.remove(this); } ...

    JAVA课程设计(1).doc

    " "Java的异常处理机制 " "Java的数据库连接技术 " "Java的多线程技术与动画制作 " "Java的网络编程 " " " "设计选题:基于C/S的图书查询系统的实现 " "包括客户端程序和服务器端程序。客户端程序向服务器端提出请求...

    Java远程监控系统设计及功能介绍.doc

    Java远程监控系统设计及功能介绍 Java Java远程监控系统是一个C/S系统,分为服务器端和客户端两部分。服务端与客户端 建 立远程连接,可以抓取客户端的图像,还可以进行远程操作。要实现Java远程监控 系统, 主要是...

    c#编写的基于Socket的异步通信系统封装DLL--SanNiuSignal.DLL

    2 ) :TCPClient客户端,通过静态方法TxStart.startClient(服务器地址或网址, 服务器端口号)注册成功客户端ITxClient;然后通过 ITxClient设置好各种属性;最后启动ITxClient.StartEngine();跟服务器启动差不多;具体...

    Ice-3.7.4.msi for windows版

    7 服务器端没有指定adapter的端口和ip,仅仅随便给了一个名字,并使用该名字从配置文件中读取信息: 启动服务器时没有问题正常,但是客户端无法连接 原因: 对象适配器无效 错误信息: 抛出异常: Ice::...

    vertx-websockets-test

    服务器端 提供用于服务静态HTML + JS的简单HTTP服务器,以及非常简单的“游戏”的事件驱动的WebSockets实现。 它的唯一目的是展示Web技术的异步功能。 这意味着玩家唯一能做的就是通过连接到服务器在随机位置随机...

    微信小程序之WebSocket

    一方面可以避免轮询带来的连接频繁建立与断开的性能损耗,另一方面数据可以是比较实时的进行双向传输(因为是长链接),而且WebSocket允许跨域通信(这里有个潜在的跨域安全的问题,得靠服务端来解决)。目前除IE外...

Global site tag (gtag.js) - Google Analytics