心跳机制

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

大部分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 心跳机制

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

java -server 和 -client 的不同,及 java -server 时抛错原因

在dos窗口运行:java -server Error: missing `server' JVM at `C:\Program Files\Java\jre7\bin\server\jvm.dll' ...

Java设置Client Socket链接Server超时时间

Java设置Client Socket链接Server超时时间 学习了:http://blog.csdn.net/tterminator/article/details/52494141 http:/ ...

Netty实现心跳机制

netty心跳机制示例,使用Netty实现心跳机制,使用netty4,IdleStateHandler 实现.Netty心跳机制,netty心跳检测,netty,心跳 本文假设你已经了解了Netty的 ...

Netty(一) SpringBoot 整合长连接心跳机制

前言 Netty 是一个高性能的 NIO 网络框架,本文基于 SpringBoot 以常见的心跳机制来认识 Netty. 最终能达到的效果: 客户端每隔 N 秒检测是否需要发送心跳. 服务端也每隔 N ...

基于netty实现的长连接,心跳机制及重连机制

技术:maven3.0.5 + netty4.1.33 + jdk1.8   概述 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速 ...

Netty心跳机制

一.概念介绍网络中的接收和发送数据都是使用操作系统中的SOCKET进行实现.但是如果此套接字已经断开,那发送数据和接收数据的时候就一定会有问题.可是如何判断这个套接字是否还可以使用呢?这个就需要在系统 ...

Netty(六):Netty中的连接管理(心跳机制和定时断线重连)

何为心跳 顾名思义, 所谓心跳, 即在TCP长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, 有可 ...

随机推荐

关于SubSonic3.0插件使用Json反序列化获得的实体进行更新操作时,只能执行添加而不能执行修改(编辑)操作的处理

由于目前开发的项目使用云计算技术,客户端只进行UI与相关事件的功能开发,而所有的计算与处理都放到了服务器端,客户端与数据库没有任何关联,所以服务器端与客户端使用我们自己开发的通讯加密方式进行,而具体的 ...

组件化h5活动模板的实现

需求: 实现一套灵活的活动组件模板,编辑人员只需要打开后台,拖拽相应组件,填入相应内容,最终就生成一个活动页面. 因为涉及投票,评论,关注等功能(每个功能都当做一个组件),所以一个富文本编辑器是无法实 ...

rsync 排除指定目录或文件进行同步

很常见的情况:我想同步/myweb下的 一些php文件 ,  但是不想复制/myweb/log/里边的一些日志文件,因为这些文件太大了,备份也是没有意义的. 现在如果想避开某个路径  直接添加—exc ...

单片AT89C2051 + SD卡 + 3310LCD = 音乐播放器

http://www.amobbs.com/thread-4503884-1-1.html 这个小玩意,采用 ATMEL 的传统51MCU作主控制芯片,加上SD卡和显示屏,就可以作简单的音乐播放器了, ...

.net core compatibility windows & windows compatible Linux

Who is this package for? This package is meant for developers that need to port existing .NET Framew ...

Python学习之旅(三十二)

Python基础知识(31):图形界面(Ⅱ) Python内置了turtle库,可以在计算机上绘图 运动控制: 1.画笔定位到坐标(x,y):turtle.goto(x,y) 2.向正方向运动 dis ...

fyzcms---相关文章推荐功能

在用我写的fyzcms的做优化的时候,考虑到文章之间的权重集中,以及相互文章间的低耦合,所以设计了一个相关文章推荐的功能. 具体使用: ,&lt ...

java 实现简单的顺序队列

package com.my; import java.util.Arrays; /** * 顺序队列 * @author wanjn * */ public class ArrayQueue { p ...

点击图片video全屏

java心跳机制_Java: server/client 心跳机制实现 示例相关推荐

  1. java 执行机制_Java类的执行机制

    在完成将class文件信息加载到JVM并产生Class对象后,就可执行Class对象的静态方法或实例化对象进行调用了.在源码编译阶段将源码编译为JVM字节码,JVM字节码是一种中间代码的方式,要由JV ...

  2. java 垃圾回收机制_Java的垃圾回收机制

    前言 在C++语言中, 程序员必须小心谨慎的处理每一项内存分配, 且内存使用完后必须手动释放曾经占用的内存空间.当内存释放不够完全时, 即存在分配但永不释放的内存块, 就会引起"内存泄漏&q ...

  3. java中间缓存变量机制_Java中间缓存变量机制

    j++,是一个依赖于java里面的"中间缓存变量机制"来实现的, ++在前就是"先加后赋"(++j) ++在后就是"先赋后加"  (j++) ...

  4. java 泛型机制_java中的泛型机制

    泛型 这种语法机制,只在程序编译阶段起作用,只是给编译器参考的.(运行阶段泛型没用) 使用了泛型好处是什么? 第一:集合中存储的元素类型统一. 第二:从集合中取出的元素类型是泛型指定的类型,不需要进行 ...

  5. java传递实例_Java方法的参数传递机制实例详解

    本文实例讲述了Java方法的参数传递机制.分享给大家供大家参考,具体如下: 参数传递机制 对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递. 按值传递意味着当将一个参数传递 ...

  6. java初反射_java中的反射机制

    前言: ​相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解AP ...

  7. java 内省机制_Java反射与内省机制总结

    Class对象封装了一个java类定义的成员变量.成员方法.构造方法.包名.类名等. 2.反射怎么用 1).获得java类的各个组成部分,首先需要获得代表java类的Class对象 获得Class对象 ...

  8. java内省和反射机制_Java内省和反射机制三步曲之 - 内省

    经过多方面的资料搜集整理,写下了这篇文章,本文主要讲解java的反射和内省机制,希望对大家有点帮助,也希望大家提出不同的看法! 1).内省(Introspector)是 Java 语言对 Bean 类 ...

  9. java 内存管理_Java的内存管理机制

    今天去参加腾讯的面试,结果是一塌糊涂.把问道的问题进行整理,希望自己可以有所收获.摘取别人的文章原文 1.Java的内存管理就是对象的分配和释放 分配:内存的分配是程序完成的,程序员通过new关键字为 ...

最新文章

  1. Windows Phone 7 Tip (5) -- App liftcycle
  2. 【upc5020】 Knight
  3. 用户创建自定义的参数ID
  4. springcloud的理解
  5. 《程序员代码面试指南》第二章 链表问题 搜索二叉树转换为双向链表
  6. Lidgren.Network – an introduction to networking in C# games
  7. java接口返回类,Java接口和返回类型 - java
  8. 微服务调用链基本原理与使用
  9. 探索储电式太阳能充电器,太阳能充电到底有没有必要有储电功能
  10. cisco链路聚合配置
  11. Excel数据填充技巧
  12. 微信小程序——使用加速计实现水平仪功能,另介绍一款硬件数据监听工具(加速计、陀螺仪、设备方向)
  13. ps特效制作人物碎片飞溅效果
  14. STM32单片机网络通信调试
  15. 电脑可以使用QQ,但是无法上网的解决方案
  16. 【每日蓝桥】10、一三年省赛Java组真题“剪格子”
  17. element Carousel 走马灯 一次轮播3张图片(整理)
  18. 基于Sentence-Bert的检索式问答系统
  19. 网格交易必须知道的一些常识
  20. jeecg设置mysql数据库_JEECG环境搭建

热门文章

  1. 用通俗易懂的大白话搞明白Java里的函数式编程和Lambda表达式
  2. python画太极图源代码
  3. 关于ACF以及PACF在时间序列分析中的应用---ARIMA滞后项阶数确定(附代码)
  4. 陶泓达:3.29午间欧盘最新走势分析及操作建议!
  5. NAS和SAN的区别
  6. 高效使用数码相机的诀窍
  7. 12、C++计算日历
  8. 啃Docker大骨头所必备的基础理论
  9. 生成模型(Generative Model)
  10. Fast-RCNN的区域候选框是怎么得到的?