溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java Socket編程心跳包創(chuàng)建實(shí)例解析

發(fā)布時(shí)間:2020-10-19 18:42:39 來(lái)源:腳本之家 閱讀:203 作者:飄楊...... 欄目:編程語(yǔ)言

1.什么是心跳包?

心跳包就是在客戶端和服務(wù)器間定時(shí)通知對(duì)方自己狀態(tài)的一個(gè)自己定義的命令字,按照一定的時(shí)間間隔發(fā)送,類(lèi)似于心跳,所以叫做心跳包。

用來(lái)判斷對(duì)方(設(shè)備,進(jìn)程或其它網(wǎng)元)是否正常運(yùn)行,采用定時(shí)發(fā)送簡(jiǎn)單的通訊包,如果在指定時(shí)間段內(nèi)未收到對(duì)方響應(yīng),則判斷對(duì)方已經(jīng)離線。用于檢測(cè)TCP的異常斷開(kāi)。基本原因是服務(wù)器端不能有效的判斷客戶端是否在線,也就是說(shuō),服務(wù)器無(wú)法區(qū)分客戶端是長(zhǎng)時(shí)間在空閑,還是已經(jīng)掉線的情況。所謂的心跳包就是客戶端定時(shí)發(fā)送簡(jiǎn)單的信息給服務(wù)器端告訴它我還在而已。代碼就是每隔幾分鐘發(fā)送一個(gè)固定信息給服務(wù)端,服務(wù)端收到后回復(fù)一個(gè)固定信息如果服務(wù)端幾分鐘內(nèi)沒(méi)有收到客戶端信息則視客戶端斷開(kāi)。

比如有些通信軟件長(zhǎng)時(shí)間不使用,要想知道它的狀態(tài)是在線還是離線就需要心跳包,定時(shí)發(fā)包收包。發(fā)包方:可以是客戶也可以是服務(wù)端,看哪邊實(shí)現(xiàn)方便合理,一般是客戶端。服務(wù)器也可以定時(shí)發(fā)心跳下去。一般來(lái)說(shuō),出于效率的考慮,是由客戶端主動(dòng)向服務(wù)器端發(fā)包,而不是服務(wù)器向客戶端發(fā)??蛻舳嗣扛粢欢螘r(shí)間發(fā)一個(gè)包,使用TCP的,用send發(fā),使用UDP的,用sendto發(fā),服務(wù)器收到后,就知道當(dāng)前客戶端還處于“活著”的狀態(tài),否則,如果隔一定時(shí)間未收到這樣的包,則服務(wù)器認(rèn)為客戶端已經(jīng)斷開(kāi),進(jìn)行相應(yīng)的客戶端斷開(kāi)邏輯處理。

2.以下是實(shí)現(xiàn)Java心跳包的簡(jiǎn)單實(shí)例

a)服務(wù)器端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.實(shí)體類(lèi)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;
	}
}

總結(jié)

以上就是本文關(guān)于Java Socket編程心跳包創(chuàng)建實(shí)例解析的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

Java多線程編程實(shí)現(xiàn)socket通信示例代碼

Java編程利用socket多線程訪問(wèn)服務(wù)器文件代碼示例

如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI