Java: server/client 心跳机制实现 示例

Client启动一个定时器,不断发心跳;
Server收到心跳后,给个回应;
Server启动一个定时器,判断Client是否存在,判断方法这里列两种:
时间差和简单标志。

时间差策略

收到一个心跳后,记录当前时间(记为recvedTime)。

判断定时器时间到达,计算多久没收到心跳的时间(T)=当前时间 - recvedTime(上面记录的时间)。如果T大于某个设定值,就可以认为Client超时了。

简单标志

收到一个心跳后,设置连接标志为true;

判断定时器时间到达,查看所有的标志,false的,认为对端超时了;true的将其设成false。

上面这种方法比上面简单一些,但检测某个Client是否离线的误差有点大。

服务端代码

public class ServerHeart extends Thread {
    private ServerSocket server = null;
    Object obj = new Object();
    @Override
    public void run() {
        try {
            server = new ServerSocket(9090);
            while (true) {
                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());
                    Object entity = in.readObject();
                    System.out.println("收到消息:"+entity);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 程序的入口main方法
     *
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("开始检测客户端是否在线...");
        new ServerHeart().start();
    }
}

客户端代码

public class ClientHeart extends Thread {
    @Override
    public void run() {
        try {
            while (true) {
                ClientSender.getInstance().send();
                synchronized (ClientHeart.class) {
                    // this.wait(5000);
                    Thread.sleep(2000);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 程序的入口main方法
     *
     * @param args
     */
    public static void main(String[] args) {
        ClientHeart client = new ClientHeart();
        client.start();
    }
}
public class ClientSender {
    private ClientSender() {
    }
    Socket sender = null;
    private static ClientSender instance;
    public static ClientSender getInstance() {
        if (instance == null) {
            synchronized (ClientHeart.class) {
                instance = new ClientSender();
            }
        }
        return instance;
    }
    public void send() {
        try {
            sender = new Socket(InetAddress.getLocalHost(), 9090);
            while (true) {
                ObjectOutputStream out = new ObjectOutputStream(sender.getOutputStream());
					Map<String,long> map = new HashMap<>();
					map.put("ip地址",时间);
                out.writeObject(map);
                out.flush();
                System.out.println("发送中..."+map);
                Thread.sleep(5000);
            }
        } catch (Exception e) {
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java实现两台服务器之间的心跳机制可以通过使用套接字(Socket)来实现。以下是一个简单的示例代码,展示了如何在两台服务器之间建立心跳连接: 服务器端代码: ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(9999); System.out.println("Server started, waiting for client..."); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress()); // 处理心跳连接 HeartbeatHandler heartbeatHandler = new HeartbeatHandler(clientSocket); heartbeatHandler.start(); } } catch (IOException e) { e.printStackTrace(); } } } class HeartbeatHandler extends Thread { private Socket clientSocket; public HeartbeatHandler(Socket clientSocket) { this.clientSocket = clientSocket; } @Override public void run() { try { while (true) { // 接收心跳消息 String message = receiveMessage(); // 处理心跳消息 if (message.equals("heartbeat")) { System.out.println("Received heartbeat from client: " + clientSocket.getInetAddress().getHostAddress()); // 回复心跳消息 sendMessage("heartbeat"); } } } catch (IOException e) { e.printStackTrace(); } } private String receiveMessage() throws IOException { // 从客户端接收消息 // ... } private void sendMessage(String message) throws IOException { // 向客户端发送消息 // ... } } ``` 客户端代码: ```java import java.io.IOException; import java.net.Socket; public class Client { public static void main(String[] args) { try { Socket serverSocket = new Socket("server-ip-address", 9999); System.out.println("Connected to server: " + serverSocket.getInetAddress().getHostAddress()); // 发送心跳消息 while (true) { sendMessage("heartbeat"); // 等待一段时间 Thread.sleep(1000); } } catch (IOException | InterruptedException e) { e.printStackTrace(); } } private static void sendMessage(String message) throws IOException { // 向服务器发送消息 // ... } } ``` 请注意,这只是一个简单的示例,并未处理连接的断开、超时等异常情况。在实际应用中,你可能需要更加完善的错误处理和容错机制来保证心跳连接的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值