javax.websocket 在spring-boot中的使用教程
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
添加配置
package org.qx.websocket.config; import org.lovely.common.core.text.Convert; import org.lovely.common.core.utils.JwtUtils; import org.lovely.common.core.utils.SpringUtils; import org.lovely.module.websocket.constants.Constants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.annotation.WebListener; import javax.websocket.HandshakeResponse; import javax.websocket.server.HandshakeRequest; import javax.websocket.server.ServerEndpointConfig; import static org.lovely.module.websocket.constants.Constants.WEBSOCKET_USER_KEY; /** * @author :ChenChao * @date :Created in 2022/6/14 14:29 * @description: */ @WebListener public class WebSocketSessionConfigurator extends ServerEndpointConfig.Configurator{ private final Logger logger = LoggerFactory.getLogger(WebSocketSessionConfigurator.class); @Override public void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) { try { // String userKey = Convert.toStr(request.getParameterMap().get(WEBSOCKET_USER_KEY).get(0)); // String userId = JwtUtils.getUserId(userKey); // logger.warn("userId:{}",userId); // config.getUserProperties().put(Constants.WEBSOCKET_UID, userId); }catch (Exception ex){ ex.printStackTrace(); } } }
业务处理
package org.qx.websocket.endpoint; import com.alibaba.fastjson.JSONObject; import org.lovely.common.core.text.Convert; import org.lovely.common.core.utils.StringUtils; import org.lovely.module.websocket.config.WebSocketSessionConfigurator; import org.lovely.module.websocket.constants.Constants; import org.lovely.module.websocket.domain.from.socket.MessageParam; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import org.springframework.web.socket.server.standard.ServerEndpointExporter; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * @author :ChenChao * @date :Created in 2022/6/14 14:28 * @description:普通 javax 的websocket */ @Component @ServerEndpoint(value = "/jx_ws", configurator = WebSocketSessionConfigurator.class) public class WebSocketServerEndpoint { private final Logger logger = LoggerFactory.getLogger(WebSocketSessionConfigurator.class); private static final Map<String, Session> users; static { users = new ConcurrentHashMap<String, Session>(); } // 必须注入这个bean 否则 会 404 @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } @OnOpen public void onOpen(EndpointConfig conf, Session session) { logger.info("连接成功"); String targetId = Convert.toStr(conf.getUserProperties().get(Constants.WEBSOCKET_UID)); if(StringUtils.hasText(targetId)) { logger.info(targetId + "连接成功"); users.put(targetId, session); } else { try { session.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * 收到消息 * @param session * @param message */ @OnMessage public void handleMessage(Session session, String message) { sendMessage(JSONObject.parseObject(message, MessageParam.class)); } @OnError public void error(Session session, java.lang.Throwable throwable) { if (throwable.getMessage() != null) { onClose(session); } } @OnClose public void onClose(Session session) { try { session.close(); String targetId = Convert.toStr(session.getUserProperties().get(Constants.WEBSOCKET_UID)); if (StringUtils.hasText(targetId)){ users.remove(targetId); } } catch (IOException e) { e.printStackTrace(); } } /** * 发送消息 * @param message * @return */ public static boolean sendMessage(MessageParam message) { Session session = users.get(message.getTargetId()); if (session == null) { return false; } session.getAsyncRemote().sendText(JSONObject.toJSONString(message), new SendHandler() { @Override public void onResult(SendResult result) { if (!result.isOK()) { users.remove(message.getTargetId()); try { session.close(); } catch (IOException e) { } } } }); return true; } }
分类:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)