1.什麼是心跳包?
心跳包就是在客戶端和服務器間定時通知對方自己狀態的一個自己定義的命令字,按照一定的時間間隔發送,類似於心跳,所以叫做心跳包。
用來判斷對方(設備,進程或其它網元)是否正常運行,採用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經離線。用於檢測TCP的異常斷開。基本原因是服務器端不能有效的判斷客戶端是否在線,也就是說,服務器無法區分客戶端是長時間在空閒,還是已經掉線的情況。所謂的心跳包就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已。代碼就是每隔幾分鐘發送一個固定信息給服務端,服務端收到後回復一個固定信息如果服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開。
比如有些通信軟件長時間不使用,要想知道它的狀態是在線還是離線就需要心跳包,定時發包收包。發包方:可以是客戶也可以是服務端,看哪邊實現方便合理,一般是客戶端。服務器也可以定時發心跳下去。一般來說,出於效率的考慮,是由客戶端主動向服務器端發包,而不是服務器向客戶端發。客戶端每隔一段時間發一個包,使用TCP的,用send發,使用UDP的,用sendto發,服務器收到後,就知道當前客戶端還處於“活著”的狀態,否則,如果隔一定時間未收到這樣的包,則服務器認為客戶端已經斷開,進行相應的客戶端斷開邏輯處理。
2.以下是實現Java心跳包的簡單實例
a)服務器端Server.java
package cn.yw.socket.heart;import java.io.ObjectInput;import java.io.ObjectInputStream;import java.net.ServerSocket;import java.net.Socket;public class Server extends Thread{private ServerSocket server = null;Object obj = new Object();@Override public void run() {try{while(true){server = new ServerSocket(25535);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.getName());System.out.println(entity.getSex());}}catch(Exception e){e.printStackTrace();}}}/** *程序的入口main方法* @param args */public static void main(String[] args){new Server().start();}}b)客戶端Client.java
package cn.yw.socket.heart;public class Client extends Thread{@Override public void run() {try{while(true){ClientSender.getInstance().send();synchronized(Client.class){// this.wait(5000);Thread.sleep(2000);}}}catch(Exception e){e.printStackTrace();}}/** * 程序的入口main方法* @param args */public static void main(String[] args){Client client = new Client();client.start();}} package cn.yw.socket.heart;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(Client.class){instance = new ClientSender();}}return instance;}public void send(){try{sender = new Socket(InetAddress.getLocalHost(),25535);while(true){ObjectOutputStream out = new ObjectOutputStream(sender.getOutputStream());Entity obj = new Entity();obj.setName("syz");obj.setSex("男");out.writeObject(obj);out.flush();Thread.sleep(5000);}}catch(Exception e){}}}3.實體類Entity.java
package cn.yw.socket.heart;import java.io.Serializable;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;}}總結
以上就是本文關於Java Socket編程心跳包創建實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站:
Java多線程編程實現socket通信示例代碼
Java編程利用socket多線程訪問服務器文件代碼示例
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!