Java Socketプログラミングハートビートパッケージ作成インスタンス解析

4711 ワード

1.ドキドキバッグとは?
ハートビートパケットとは、クライアントとサーバの間でタイミングを決めて相手に自分の状態を知らせる独自の定義されたコマンドワードで、一定の時間間隔で送信され、ハートビートに似ているので、ハートビートパケットと呼ばれます.
相手(デバイス、プロセス、または他のメタ)が正常に動作しているかどうかを判断するために、簡単な通信パケットをタイミングで送信し、指定された期間内に相手の応答を受信していない場合は、相手がオフラインであると判断します.TCPの異常切断を検出します.基本的な原因は,サーバ側がクライアントがオンラインであるか否かを効果的に判断できないこと,すなわち,サーバがクライアントが長時間アイドルであるか,あるいはオフラインであるかを区別できないことである.ハートビートパケットとは,クライアントが時間通りに簡単な情報をサーバ側に送信して私がまだいることを伝えることである.コードは数分おきに固定情報をサービス側に送信し、サービス側が受信した後に固定情報に返信する.サービス側が数分以内にクライアント情報を受信しなければ、クライアントによって切断される.
例えば、一部の通信ソフトは長い間使用していないので、その状態がオンラインなのかオフラインなのかを知るには心拍包が必要で、タイミング発注してパッケージを受け取る.発注者:取引先でもサービス側でも、どちらが便利で合理的かを見て、一般的にはクライアントです.サーバーも定期的にドキドキすることができます.一般的に、効率的な観点から、サーバがクライアントに送信するのではなく、クライアントがサーバ側に送信する.クライアントは一定時間ごとに1つのパケットを送って、TCPのを使って、sendで送って、UDPのを使って、sendtoで送って、サーバーが受け取った後に、現在のクライアントがまだ“生きている”状態にあることを知っていて、さもなくば、一定時間隔ててこのようなパケットを受け取っていないならば、サーバーは客先がすでに切れたと思って、相応のクライアントが論理処理を切ることを行います.
2.Javaハートビートパッケージを実装する簡単な例を以下に示します.
a)サーバ側サーバ.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マルチスレッドによるサーバファイルコードへのアクセス例
不足点があれば、コメントを歓迎します.友达の本駅に対する支持に感谢します!