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完成。