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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM