最近在开发中遇到一个问题,就是如何判断远端服务器是否已经断开连接,如果断开那么需要重新连接。
首先想到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服务器端在断开后重新打开时,客户端的自动重连机制主要依赖于心跳检测、异常处理、重试策略和超时设定。通过这些技术手段,可以确保在网络不稳定或服务器短暂离线的情况下,客户端仍能恢复与服务器...
- **网络监听**:使用`ConnectivityManager`监控网络状态变化,但这种方法只能检测到设备的网络连接是否可用,不能判断特定Socket连接的状态。 以下是一个简单的示例代码,展示如何使用心跳机制检测网络断开: ``...
在Java编程中,Socket是网络通信的基础,它允许两个应用程序通过TCP/IP协议进行数据传输。Socket连接分为两种类型:长连接和短连接。这两种连接方式各有特点,适用于不同的应用场景。 **1. 短连接(Short ...
当客户端主动断开连接时,服务器端会收到`RemoteHostClosedError`错误信号。这个错误表明远程主机(即客户端)已经关闭了连接。值得注意的是,客户端可能会在发送完远程关闭通知后才真正关闭连接。 为了检测这个...
总之,Android Socket服务器端开发涉及到Java网络编程、多线程、权限管理等多个方面,对于实现设备间的实时通信有着重要作用。通过上述步骤,你可以创建一个基础的Android Socket服务器,然后根据具体需求扩展功能,...
在本文档中,我们将探讨一种机制,即如何在SOCKET长连接通信中判断客户端在一定时间内(例如10秒)是否收到来自服务器的数据或向服务器发送数据,并在此基础上实现自动断开连接的功能。此外,本文还将根据提供的部分...
在Java编程中,Socket通信是网络应用程序之间进行双向通信的基础。Socket API提供了低级别的网络通信接口,使得开发者能够创建客户端和服务器之间的连接。本话题主要关注如何使用Java Socket实现数据的收发,并在...
"服务器端支持客户端的掉线检测"是一项关键特性,它允许服务器检测并处理客户端意外断开连接的情况。通常,可以通过设置超时机制,如果在一段时间内客户端没有发送任何数据,服务器可以认为客户端已经掉线。另一种...
在Java中,通过`java.net.Socket`类来表示客户端,`java.net.ServerSocket`类来表示服务器端。本案例实现了基于TCP协议的Socket长连接,即客户端和服务端建立连接后,保持连接状态,进行多次数据交互而无需频繁建立...
Socket分为客户端(Socket Client)和服务器端(Socket Server),它们共同构成了基于TCP/IP协议的通信模型。本篇文章将详细探讨Android环境下如何进行Socket Client端和Socket Server端的数据发送与接收。 1. **...
总的来说,Java的`Socket`和`ServerSocket`类为网络通信提供了便利,结合多线程和超时机制,可以构建出稳定可靠的服务器端程序。在实际项目中,根据需求可能还需要考虑异常处理、数据编码解码、安全加密等方面,以...
这个压缩包文件包含了一个基于Android和Java开发的音乐类游戏项目,其中重点在于使用Java Socket实现的服务器端代码。在本文中,我们将深入探讨相关的IT知识点。 首先,我们要理解Java语言在游戏开发中的应用。Java...
在这个实例中,我们将探讨如何在Java中实现一个多线程的Socket服务器,以便同时处理多个客户端的请求。多线程是关键,因为它允许服务器并行处理多个连接,提高了系统的效率和响应速度。 首先,我们需要了解Socket的...
- C#客户端创建`Socket`实例并调用`Connect()`方法,而Java服务器端创建`ServerSocket`实例,监听客户端的连接请求。 6. **实现简单通信**: - 简单通信通常涉及发送字符串或二进制数据。发送方将数据写入输出流...
服务器端负责监听特定端口,等待多个客户端的连接请求,一旦有新用户接入,就会创建一个新的Socket来处理该用户的通信。客户端则通过Socket连接到服务器,发送消息,并接收来自其他用户的消息。 在多用户聊天场景下...
在Java中,`java.net.Socket` 和 `java.net.ServerSocket` 是两个主要的类,分别代表客户端和服务器端的Socket。客户端Socket用于连接到服务器,而服务器端Socket则监听特定端口,等待客户端的连接请求。 在屏幕...
Java中的Socket编程主要包括两个部分:客户端Socket和服务器端Socket。 - **客户端Socket**:通常用于发起连接请求,并与服务器建立通信。 - **服务器端Socket**:负责监听客户端的连接请求,并接收来自客户端的...
服务器端创建监听Socket,等待客户端连接;客户端通过Socket连接到服务器,建立起通信链路。 **一、服务器端开发** 1. **服务器初始化**:服务器程序首先要创建一个ServerSocket实例,指定监听的端口号,开启监听...
11. **实战源码分析**:书中提供的源码可以帮助读者更好地理解TCP/IP Socket编程的实践过程,包括客户端发起连接、服务器端接收连接、数据传输以及断开连接等逻辑。 通过学习和实践这些知识点,开发者能够熟练掌握...
本实例——"Socket服务器端实例(网络聊天室)",将带你深入理解Socket在构建网络聊天室中的应用。 首先,让我们了解什么是Socket。Socket,又称为套接字,是网络通信的基本单元,它允许两台计算机通过网络交换数据。...