前后端分离:java websocket实时通讯【已经在项目中使用】
第一个java类: import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { /** * 注入一个ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
第二个java类: import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;
import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger;
/**
-
前后端交互的类实现消息的接收推送(自己发送给另一个人) -
@ServerEndpoint(value = “/websocket”) 前端通过此URI 和后端交互,建立连接 */ @Slf4j @ServerEndpoint(value = “/websocket”) @Component public class WebSocketServer { /** 记录当前在线连接数 */ private static AtomicInteger onlineCount = new AtomicInteger(0); /** 存放所有在线的客户端 */ public static Map<String, Session> clients = new ConcurrentHashMap<>(); /**
- 连接建立成功调用的方法
*/ @OnOpen public void onOpen(Session session) { onlineCount.incrementAndGet(); // 在线数加1 clients.put(session.getId(), session); log.info(“有新连接加入:{},当前在线人数为:{}”, session.getId(), onlineCount.get()); sendMessage(session.getId(),session); } /**
- 连接关闭调用的方法
*/ @OnClose public void onClose(Session session) { onlineCount.decrementAndGet(); // 在线数减1 clients.remove(session.getId()); for (String key : WebSocketServer.clients.keySet()) { if(key.contains(session.getId())){ clients.remove(key); clients.remove(key.split("_")[0]); break; } } log.info(“有一连接关闭:{},当前在线人数为:{}”, session.getId(), onlineCount.get()); } /**
- 收到客户端消息后调用的方法
- @param message
-
客户端发送过来的消息
*/ @OnMessage public void onMessage(String message, Session session) { log.info(“服务端收到客户端[{}]的消息[{}]”, session.getId(), message); if(message.contains(session.getId())){ clients.put(message,session);//标识 } /try { this.sendMessage(“server say :hello-[”+session.getId()+ “] you say:”+message, session); } catch (Exception e) { log.error(“解析失败:{}”, e); }/ } @OnError public void onError(Session session, Throwable error) { log.error(“发生错误”); error.printStackTrace(); } /**
- 服务端发送消息给客户端
*/ public static void sendMessage(String message, Session toSession) { try { log.info(“服务端给客户端[{}]发送消息[{}]”, toSession.getId(), message); toSession.getBasicRemote().sendText(message); } catch (Exception e) { log.error(“服务端发送消息给客户端失败:{}”, e); } } }
H5测试:
WebSocket Test Send Close
|