帮我写一个 Java后端的 webSocket心跳包检测 如果1分钟内没接收到心跳包 则从session中删除
时间: 2023-06-02 17:02:58 浏览: 149
socket心跳测试(java)
5星 · 资源好评率100%
以下是一个简单的 Java 后端 WebSocket 心跳包检测代码示例:
```
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/websocket")
public class WebSocketServer {
// 存储所有 WebSocket 会话
private static Map<Session, Long> sessions = new ConcurrentHashMap<>();
@OnOpen
public void onOpen(Session session) {
// 将新会话添加到 sessions Map 中
sessions.put(session, System.currentTimeMillis());
}
@OnMessage
public void onMessage(String message, Session session) {
// 如果收到的消息是心跳包,则更新会话最后活动时间
if (message.equals("ping")) {
sessions.put(session, System.currentTimeMillis());
}
}
@OnClose
public void onClose(Session session) {
// 从 sessions Map 中删除已关闭的会话
sessions.remove(session);
}
@OnError
public void onError(Throwable error) {
error.printStackTrace();
}
// 定时检查所有会话的最后活动时间,如果超过 1 分钟则从 sessions Map 中删除
@javax.ejb.Schedule(second="*/10", minute="*", hour="*", persistent=false)
public void checkSessions() {
long currentTime = System.currentTimeMillis();
for (Session session : sessions.keySet()) {
long lastActiveTime = sessions.get(session);
if (currentTime - lastActiveTime > 60000) {
sessions.remove(session);
try {
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
```
上述代码利用了 Java EE 定时任务(Scheduled Task)的功能,每 10 秒钟检查一次所有 WebSocket 会话的最后活动时间,如果超过 1 分钟则从 sessions Map 中删除。在 onOpen 方法中,将新会话添加到 sessions Map 中;在 onMessage 方法中,如果收到的消息是心跳包,则更新会话最后活动时间;在 onClose 方法中,从 sessions Map 中删除已关闭的会话;在 onError 方法中,打印错误堆栈信息。
阅读全文