java心跳发送
java心跳发送:
大家都知道。如果你在互联网公司,并且开发的是产品那你一定接触不到。心跳机制。心跳包
那什么是心跳机制呢?
心跳机制就是定时发送一个自定义的结构体(心跳包)。确保连接的有效的机制。
大部分CS的应用需要心跳机制。心跳机制一般在Server和Client都要实现,两者实现原理基本一样。Client不关心性能,怎么做都行。
如果应用是基于TCP的,可以简单地通过SO_KEEPALIVE实现心跳。TCP在设置的KeepAlive定时器到达时向对端发一个检测TCP segment,如果没收到ACK或RST,尝试几次后,就认为对端已经不存在,最后通知应用程序。这里有个缺点是,Server主动发出检测包,对性能有点影响。
应用自己实现
Client启动一个定时器,不断发心跳;
Server收到心跳后,给个回应;
Server启动一个定时器,判断Client是否存在,判断方法这里列两种:
时间差和简单标志。
直接例子:加入现在我们发送一个对象
第一:首先定义一个实体类对象
package com.huojg.test;
import javax.swing.*;
import java.awt.event.ActionListener;
import java.io.Serializable; /**心跳用timer定时器来完成
*
* 心跳机制:就是定时发送一个结构体(心跳包),让对方知道自己还活着。以确保连接的有效性的机制。
* 大部分cs的应用需要用到心跳机制。心跳机制一般在server与client都要实现。如果应用是基于TCP,以简单地通过SO_KEEPALIVE实现心跳
*
*
* 应用自己实现
Client启动一个定时器,不断发心跳;
Server收到心跳后,给个回应;
Server启动一个定时器,判断Client是否存在,判断方法这里列两种:
时间差和简单标志。 此处我们实现一个发送对象
* */ public class Entity implements Serializable {
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 + "]";
} }
第二:我们定义服务端的server类
package com.huojg.test; import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket; /**
* 完成心跳的server端
*/
public class ServerHeartTest extends Thread {
private ServerSocket server = null;
Object obj = new Object();
@Override
public void run() {
try {
server=new ServerSocket(9090);
while(true){
Socket clent=server.accept();
synchronized (obj) {
new Thread(new Client(clent)).start();;
}
}
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
System.out.println("开始检测客户端是否在线...");
new ServerHeartTest().start();
}
}
/**客户端线程
*
*
* */
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();
}
} }
第三步:定义客户端
package com.huojg.test;
/**
* 客户端
* */
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();
} }
最后我们来定义一个业务类:
package com.huojg.test; import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket; 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("huojg");
obj.setSex("男");
out.writeObject(obj);
out.flush(); System.out.println("已发送...");
Thread.sleep(5000);
}
} catch (Exception e) { }
}
}
有这个四个类我们开启服务,打开client客户端。就可以看到,后台的,心跳程序运行了,
结论:
其实:心跳就是不停的操作,我们用定时器也可以做到。只是目前是C/S框架中实现的,主要使用socket完成。
java心跳发送的更多相关文章
- java httpclient发送json 请求 ,go服务端接收
/***java客户端发送http请求*/package com.xx.httptest; /** * Created by yq on 16/6/27. */ import java.io.IOEx ...
- JAVA邮件发送的简单实现
JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件.这一机制被广泛的用在注 ...
- 解决java mail发送TXT附件被直接显示在正文中的问题
这两天遇到一个问题,关于使用java mail发送邮件的问题. 详细是这样子的:我使用java mail发送异常报告邮件,邮件中有一个包含异常日志的附件,和关于设备信息的邮件正文.假设日志为log后缀 ...
- EBS中使用JAVA方式发送HTML格式邮件
转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17174769 EBS中使用JAVA方式发送HTML格式邮件 一.开发工具:JDevel ...
- java后台发送请求并获取返回值(续)
在java后端发送请求给另一个平台,从而给前端实现 "透传"的过程中,出现:数据请求到了并传到了前端,但是控制台打印时中文显示Unicode码而前端界面中中文显示不出来!!!开始怀 ...
- java-基于JavaMail的Java邮件发送
1.基于JavaMail的Java邮件发送:简单邮件发送 2.基于JavaMail的Java邮件发送:复杂邮件发送
- 基于JavaMail的Java邮件发送:复杂邮件发送
参考:http://blog.csdn.net/xietansheng/article/details/51722660package com.bfd.ftp.utils;import java.ut ...
- java邮件发送(含附件)
1. [代码]java邮件发送(含附件)疯狂的IT人站长整理的:利用Java发送邮件(含附件)的例子:1.邮件发送的配置propertity文件内容如下:(utils.properties文件放在sr ...
- 通过Fiddler监控Java应用发送请求及相应数据
Fiddler可以很好的监控浏览器发送的各种请求及响应数据,对于JAVA程序默认情况下是无法监控的,但实际需求中需要监控JAVA程序发送HTTP请求及返回数据是否正确. Fiddler默认配置的监听端 ...
随机推荐
- 2,搭建一个java开发环境
(1)java开发需要的条件? 1)适用于环境开发的jdk(里面包括了jre和加热里面包括了jvm) 2)对应开发环境的eclipse 3)如果涉及到web开发,还需要web服务器(Tomcat) ( ...
- 利用Yum彻底移除docker
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-la ...
- kubernetes--pod的生命周期管理
下文基于kubernetes 1.5.2版本编写 lifecycle 概念 创建资源对象时,可以使用lifecycle来管理容器在运行前和关闭前的一些动作. lifecycle有两种回调函数: Pos ...
- hdata datax交流总结
http://blog.csdn.net/zlm838687/article/details/74781522 hdata datax交流总结 今天和阿里云的同学就数据同步做了简要的交流,下面就交流的 ...
- 关于ElasticSearch默认窗口结果集参数max_result_window修改
在Linux服务器中执行如下命令 curl -XPUT http://192.168.46.163:9200/t_order/_settings -d '{ "index" : { ...
- [Angular] Debug Angular apps in production without revealing source maps
Source: https://blog.angularindepth.com/debug-angular-apps-in-production-without-revealing-source-ma ...
- Android学习(十六) 通过GestureDetector进行手势识别
一.手势交互过程: 1)触屏时,触发MotionEvent事件. 2)被OnTouchListener监听,在onTouch()中获得MotionEvent对象. 3)GestureDetector转 ...
- python——Container之字典(dict)详解
字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型.列表是有序的对象结合,字典是无序的对象集合.两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取. ...
- 【Excle数据透视表】如何重复显示行字段的项目标签
前提:该数据透视表以表格形式显示 解决办法: 通过报表布局设置"重复所有项目标签" 修改前样式 步骤 单击数据透视表中任意单元格→设计→报表布局→重复所有项目标签 修改后样式
- asp.net中UpdatePanel数据加载成功后回调
//添加UpdatePanel加载成功后执行的js方法 Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(onPageLoade ...