Java: server/client 心跳机制实现 示例
心跳机制
心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制。
大部分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: server/client 心跳机制实现 示例的更多相关文章
- 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 连接的有效性. 为什么需要心跳 因为网络的不可靠性, 有可 ...
随机推荐
- javascript中的时间版运动
前面的话 速度版JS运动是指以速度为参照,随着路程的变化,时间随之变化:而时间版JS运动是指以时间为参照,随着路程的变化,速度随着变化.相较而言,时间版JS运动更为常用.JQ的animate就是时间版 ...
- 0711HTML初体验
今天是正式上课的第一天.这边先记下初学的时候容易忘记的问题.在图片上链接汉子显示是<title="想在图片显示的内容">. 合并单元格,合并行<td colspa ...
- 从零宽断言说起到用python匹配html标签内容
版权声明:本文为博主原创文章,转载请附带原文网址http://www.cnblogs.com/wbchanblog/p/7411750.html ,谢谢! 提示:本文主要是讲解零宽断言,所以阅读本文需 ...
- koa-router源码分析
koa-router源码地址是 koa-router 当前解读版本为7.2.1 关系图 代码结构图 执行流程图 关系对应图 Router方法和属性浅析 methods.forEach 注册注册路由的方 ...
- 【win10】大水牛主机插入耳机没有声音
主机:大水牛,技嘉主板 操作系统:win10 问题:主机前面插入耳机,没有声音,扬声器图标出错 解决 一..插入耳机 二..Realtek高清晰音频管理器 1.打开音频管理器,点击右下角的设置 2.点 ...
- [js高手之路]面向对象+设计模式+继承一步步改造简单的四则运算
到目前为止,我已经写完了面向对象完整的一个系列知识,前面基本属于理论,原理的理解,接下来,我们就用学到的知识来实战下吧. 看看理解原理和理论是否重要?例子从简单到复杂 一.单体(字面量)封装加减乘除 ...
- C# 隐藏文件
void SerializeXmlNodes(XmlSerializer serialize, string filePath, List<XmlNode> nodes) { using ...
- 【渗透课程】前言-揭开Web渗透与安全的面纱(必看)
服务器是怎么被入侵的 攻击者想要对一台计算机渗透必须具备以下条件: 1.服务器与客户端能够正常通讯 (服务器是为客户端提供服务的) 2.服务器向客户端提供的权限(服务)或者说是端口. 服务端所提供的服 ...
- 第三篇--Jmeter测试数据库Mysql
Jmeter模拟100用户访问Mysql数据库 1.将Mysql数据库的驱动[mysql-connector-java-5.1.15-bin.jar]放到jmeter的lib目录下,新建线程组100[ ...
- idea 远程调试
Idea 远程在线测试 描述:在window下开发,部署到Linux服务器上,往往会遇到在windows下正常运行,在Linux服务器下异常,这是需要本地调试远程代码: 操作步骤: 一.代码已知 保证 ...