1.什么是心跳包?
創(chuàng)新互聯(lián)專注于企業(yè)成都全網(wǎng)營銷、網(wǎng)站重做改版、??稻W(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、商城網(wǎng)站制作、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為保康等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
心跳包就是在客戶端和服務(wù)器間定時通知對方自己狀態(tài)的一個自己定義的命令字,按照一定的時間間隔發(fā)送,類似于心跳,所以叫做心跳包。
用來判斷對方(設(shè)備,進程或其它網(wǎng)元)是否正常運行,采用定時發(fā)送簡單的通訊包,如果在指定時間段內(nèi)未收到對方響應(yīng),則判斷對方已經(jīng)離線。用于檢測TCP的異常斷開。基本原因是服務(wù)器端不能有效的判斷客戶端是否在線,也就是說,服務(wù)器無法區(qū)分客戶端是長時間在空閑,還是已經(jīng)掉線的情況。所謂的心跳包就是客戶端定時發(fā)送簡單的信息給服務(wù)器端告訴它我還在而已。代碼就是每隔幾分鐘發(fā)送一個固定信息給服務(wù)端,服務(wù)端收到后回復(fù)一個固定信息如果服務(wù)端幾分鐘內(nèi)沒有收到客戶端信息則視客戶端斷開。
比如有些通信軟件長時間不使用,要想知道它的狀態(tài)是在線還是離線就需要心跳包,定時發(fā)包收包。發(fā)包方:可以是客戶也可以是服務(wù)端,看哪邊實現(xiàn)方便合理,一般是客戶端。服務(wù)器也可以定時發(fā)心跳下去。一般來說,出于效率的考慮,是由客戶端主動向服務(wù)器端發(fā)包,而不是服務(wù)器向客戶端發(fā)。客戶端每隔一段時間發(fā)一個包,使用TCP的,用send發(fā),使用UDP的,用sendto發(fā),服務(wù)器收到后,就知道當(dāng)前客戶端還處于“活著”的狀態(tài),否則,如果隔一定時間未收到這樣的包,則服務(wù)器認為客戶端已經(jīng)斷開,進行相應(yīng)的客戶端斷開邏輯處理。
2.以下是實現(xiàn)Java心跳包的簡單實例
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.實體類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)建實例解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
Java多線程編程實現(xiàn)socket通信示例代碼
Java編程利用socket多線程訪問服務(wù)器文件代碼示例
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
名稱欄目:JavaSocket編程心跳包創(chuàng)建實例解析
網(wǎng)頁路徑:http://chinadenli.net/article44/joidhe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、微信小程序、網(wǎng)站設(shè)計公司、建站公司、網(wǎng)站策劃、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)