心跳机制

心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。

大部分CS的应用需要心跳机制。心跳机制一般在Server和Client都要实现,两者实现原理基本一样。Client不关心性能,怎么做都行。

如果应用是基于TCP的,可以简单地通过SO_KEEPALIVE实现心跳。TCP在设置的KeepAlive定时器到达时向对端发一个检测TCP segment,如果没收到ACK或RST,尝试几次后,就认为对端已经不存在,最后通知应用程序。这里有个缺点是,Server主动发出检测包,对性能有点影响。

应用自己实现

Client启动一个定时器,不断发心跳;

Server收到心跳后,给个回应;

Server启动一个定时器,判断Client是否存在,判断方法这里列两种:

时间差和简单标志。

时间差策略

收到一个心跳后,记录当前时间(记为recvedTime)。

判断定时器时间到达,计算多久没收到心跳的时间(T)=当前时间 - recvedTime(上面记录的时间)。如果T大于某个设定值,就可以认为Client超时了。

简单标志

收到一个心跳后,设置连接标志为true;

判断定时器时间到达,查看所有的标志,false的,认为对端超时了;true的将其设成false。

上面这种方法比上面简单一些,但检测某个Client是否离线的误差有点大。

Demo

此处我们实现一个发送对象,例子简陋,实际在工作中还需按需求修改。

实体类

package com.lee.entity;

import java.io.Serializable;

public class Entity implements Serializable {

private static final long serialVersionUID = 1L;

private String name;

private String sex;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getSex() {

return sex;

}

public void setSex(String sex) {

this.sex = sex;

}

@Override

public String toString() {

return "Entity [name=" + name + ", sex=" + sex + "]";

}

}

服务端

ServerHeart.java

package com.lee.server;

import java.io.ObjectInput;

import java.io.ObjectInputStream;

import java.net.ServerSocket;

import java.net.Socket;

import com.lee.entity.Entity;

public class ServerHeart extends Thread {

private ServerSocket server = null;

Object obj = new Object();

@Override

public void run() {

try {

server = new ServerSocket(9090);

while (true) {

Socket client = server.accept();

synchronized (obj) {

new Thread(new Client(client)).start();

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 客户端线程

*

* @author USER

*

*/

class Client implements Runnable {

Socket client;

public Client(Socket client) {

this.client = client;

}

@Override

public void run() {

try {

while (true) {

ObjectInput in = new ObjectInputStream(client.getInputStream());

Entity entity = (Entity) in.readObject();

System.out.println(entity);

}

} catch (Exception e) {

e.printStackTrace();

}

}

}

/**

* 程序的入口main方法

*

* @param args

*/

public static void main(String[] args) {

System.out.println("开始检测客户端是否在线...");

new ServerHeart().start();

}

}

客户端

ClientHeart.java

package com.lee.client;

public class ClientHeart extends Thread {

@Override

public void run() {

try {

while (true) {

ClientSender.getInstance().send();

synchronized (ClientHeart.class) {

// this.wait(5000);

Thread.sleep(2000);

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 程序的入口main方法

*

* @param args

*/

public static void main(String[] args) {

ClientHeart client = new ClientHeart();

client.start();

}

}

ClientSender.java

package com.lee.client;

import java.io.ObjectOutputStream;

import java.net.InetAddress;

import java.net.Socket;

import com.lee.entity.Entity;

public class ClientSender {

private ClientSender() {

}

Socket sender = null;

private static ClientSender instance;

public static ClientSender getInstance() {

if (instance == null) {

synchronized (ClientHeart.class) {

instance = new ClientSender();

}

}

return instance;

}

public void send() {

try {

sender = new Socket(InetAddress.getLocalHost(), 9090);

while (true) {

ObjectOutputStream out = new ObjectOutputStream(sender.getOutputStream());

Entity obj = new Entity();

obj.setName("xiaoming");

obj.setSex("男");

out.writeObject(obj);

out.flush();

System.out.println("已发送...");

Thread.sleep(5000);

}

} catch (Exception e) {

}

}

}

java心跳机制_Java 心跳机制实现 DOM相关推荐

  1. java tcp 心跳机制_java 心跳机制

    心跳机制:就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到客户端信息则视客户端断开. 心跳包 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定 ...

  2. java 反射代价_Java反射机制

    # 反射 ## 什么是反射 反射是Java提供的动态执行机制, 可以动态加载类, 动态创建对象, 动态访问属性, 动态调用方法.. 静态执行: Java代码经过编译以后就确定的执行次序, 称为静态执行 ...

  3. java 抛出异常效率_Java异常处理机制

    与C++.python,Ruby一样,Java也有一个异常处理机制,当程序出现异常时,系统会自动生成一个Exception对象通知程序去处理.之所以这样设计目的在于使程序有更好的容错性和可读性,实现业 ...

  4. java的 内省机制_Java 内省机制

    Java 内省机制 一.内省机制概述 ​ Java 中的反射机制是通过名称得到类的方法和对象的成份,对于一切 Java 类都是适用的,但是有时候使用起来比较麻烦.而 JavaBean 是一种特殊的 J ...

  5. java 反射机制_Java反射机制原理探究

    反射是Java中的一个重要的特性,使用反射可以在运行时动态生成对象.获取对象属性以及调用对象方法.与编译期的静态行为相对,所有的静态型操作都在编译期完成,而反射的所有行为基本都是在运行时进行的,这是一 ...

  6. java 反射 工厂_JAVA反射机制、工厂模式与SPRING IOC

    ABSTRACT Spring的IOC(控制反转)是Spring框架的灵魂,有了它才有了Spring的很多其他的灵活的特性.使用 Spring 开发项目时,控制层.业务层.DAO 层都是通过 IoC ...

  7. java f反射_java反射机制

    反射定义 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为jav ...

  8. java泛型机制_Java泛型机制必要性及原理解析

    泛型程序设计(Generic Programming) "使用泛型机制编写的程序代码要比那些杂乱地使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性.泛型对于集合类尤 ...

  9. java反射模式_Java反射机制详解

    对于一般的开发者,很少需要直接使用Java反射机制来完成功能开发,但是反射是很多框架譬如 Spring, Mybatis 实现的核心,反射虽小,能量却很大. 本文主要介绍反射相关的概念以及API的使用 ...

最新文章

  1. tensorflow打印模型结构_Tensorflow上手1: Print与py_func
  2. linux 终端管理工具,linux服务器-远程管理-screen:强大的终端管理工具
  3. 解决PhpStorm卡顿的问题
  4. 深入理解Java虚拟机04--类结构文件
  5. 信号、系统与滤波器设计(matlab)
  6. 从营销手段到商业新基建,“以旧换新”还有多少价值等待挖掘?
  7. ajax+webservice
  8. halcon学习(算子汇总)
  9. Python手写神经网络实现3层感知机
  10. 【跟着我们学Golang】基础结构
  11. ASP.NET 2.0 Page的执行顺序
  12. mysql 重置密码_mysql忘记密码如何重置密码,以及修改root密码的三种方法
  13. amCharts使用方式
  14. STM32F103 读写内部FLASH—学习笔记(野火)
  15. mysql报错1517_错误日志 userenv ID1524 1517
  16. 微支付基础:信任的成本
  17. Linux的DNS正向解析和转发配置
  18. 【Json】——jsoncpp的序列化以及反序列化
  19. Android 4.4Phone的变化(二)
  20. Numeric Keypad

热门文章

  1. Swift版本都到5了,ABI稳定了,你清楚吗
  2. Java反射常用命令
  3. 如何批量生成16进制流水号条码
  4. Android学习提纲
  5. 【nowcoder 217602】照看小猫
  6. 【转】《Pandas Cookbook》第02章 DataFrame基本操作
  7. 查询mysql的隔离级别_怎么查看数据库隔离级别
  8. 腾讯首页js图片切换效果
  9. 动态规划C++实现--龙与地下城游戏
  10. MOOC Web前端笔记(三):CSS样式