Java Socket編程心跳包創(chuàng)建實例解析
1.什么是心跳包?
心跳包就是在客戶端和服務(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ā)??蛻舳嗣扛粢欢螘r間發(fā)一個包,使用TCP的,用send發(fā),使用UDP的,用sendto發(fā),服務(wù)器收到后,就知道當(dāng)前客戶端還處于“活著”的狀態(tài),否則,如果隔一定時間未收到這樣的包,則服務(wù)器認(rèn)為客戶端已經(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編程利用socket多線程訪問服務(wù)器文件代碼示例
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
Java實現(xiàn)公用實體類轉(zhuǎn)Tree結(jié)構(gòu)
這篇文章主要為大家介紹了一個Java工具類,可以實現(xiàn)Java公用實體類轉(zhuǎn)Tree結(jié)構(gòu),文中的示例代碼簡潔易懂,感興趣的小伙伴可以參考一下2024-10-10
Springboot結(jié)合@validated優(yōu)化代碼驗證
這篇文章主要介紹了Springboot與@validated注解結(jié)合從而實現(xiàn)讓你的代碼驗證更清爽,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
java面向?qū)ο笤O(shè)計原則之迪米特法則分析詳解
這篇文章主要為大家介紹了java面向?qū)ο笤O(shè)計原則之迪米特法則的示例分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,學(xué)有所得2021-10-10

