国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Java Socket編程心跳包創建實例解析

2024-07-13 10:15:31
字體:
來源:轉載
供稿:網友

1.什么是心跳包?

心跳包就是在客戶端和服務器間定時通知對方自己狀態的一個自己定義的命令字,按照一定的時間間隔發送,類似于心跳,所以叫做心跳包。

用來判斷對方(設備,進程或其它網元)是否正常運行,采用定時發送簡單的通訊包,如果在指定時間段內未收到對方響應,則判斷對方已經離線。用于檢測TCP的異常斷開。基本原因是服務器端不能有效的判斷客戶端是否在線,也就是說,服務器無法區分客戶端是長時間在空閑,還是已經掉線的情況。所謂的心跳包就是客戶端定時發送簡單的信息給服務器端告訴它我還在而已。代碼就是每隔幾分鐘發送一個固定信息給服務端,服務端收到后回復一個固定信息如果服務端幾分鐘內沒有收到客戶端信息則視客戶端斷開。

比如有些通信軟件長時間不使用,要想知道它的狀態是在線還是離線就需要心跳包,定時發包收包。發包方:可以是客戶也可以是服務端,看哪邊實現方便合理,一般是客戶端。服務器也可以定時發心跳下去。一般來說,出于效率的考慮,是由客戶端主動向服務器端發包,而不是服務器向客戶端發。客戶端每隔一段時間發一個包,使用TCP的,用send發,使用UDP的,用sendto發,服務器收到后,就知道當前客戶端還處于“活著”的狀態,否則,如果隔一定時間未收到這樣的包,則服務器認為客戶端已經斷開,進行相應的客戶端斷開邏輯處理。

2.以下是實現Java心跳包的簡單實例

a)服務器端Server.javascript/17508.html">java/255789.html">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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临颍县| 丰镇市| 浦城县| 什邡市| 南召县| 平顺县| 黄浦区| 温宿县| 深水埗区| 金阳县| 鄂尔多斯市| 五大连池市| 达州市| 阿克陶县| 克山县| 凤城市| 新竹县| 筠连县| 诸暨市| 梁河县| 南昌市| 雷山县| 元朗区| 康保县| 茂名市| 望都县| 门头沟区| 伊宁市| 固安县| 平陆县| 镇赉县| 满洲里市| 宁都县| 宁海县| 香港| 南华县| 宁陵县| 德格县| 城口县| 罗定市| 榆社县|