Spring boot整合websocket(一)----傳統註冊方式
阿新 • • 發佈:2018-12-20
修改配置類
@Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer{ @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { //handler是webSocket的核心,配置入口 registry.addHandler(new CTIHandler(), "/webscoket/call/{ID}").setAllowedOrigins("*").addInterceptors(new WebSocketInterceptor()); } }
增加攔截器的配置
public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor { /** * 配置日誌 */ private final static Logger logger = LoggerFactory.getLogger(WebSocketInterceptor.class); @Override public boolean beforeHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse seHttpResponse, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { // HttpServletRequest request = ((ServletServerHttpRequest) serverHttpRequest).getServletRequest(); String userName = serverHttpRequest.getURI().toString().split("ID=")[1]; attributes.put("userName", userName); logger.info("握手之前"); //從request裡面獲取物件,存放attributes return super.beforeHandshake(serverHttpRequest, seHttpResponse, wsHandler, attributes); } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { logger.info("握手之後"); super.afterHandshake(request, response, wsHandler, ex); } }
修改handler類
@Service public class CTIHandler extends ParentHandler implements WebSocketHandler,RedisReceiveService { /** * 配置日誌 */ private final static Logger logger = LoggerFactory.getLogger(CTIHandler.class); //新增socket @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { logger.info("外呼成功建立連線"); //獲取使用者資訊 String userName = (String) session.getAttributes().get("userName"); logger.info("獲取當前"+socketMap.get(userName)); if(socketMap.get(userName)==null) { socketMap.put(userName,session); } logger.info("連結成功"); } /** * 接收socket資訊 */ @Override public void handleMessage(WebSocketSession webSocketSession, WebSocketMessage<?> webSocketMessage) throws Exception { String userName = (String) webSocketSession.getAttributes().get("userName"); String payLoad = Pub_Tools.getString_TrimZeroLenAsNull(webSocketMessage.getPayload()); logger.info("收到的訊息"+payLoad); } /** * 連接出錯 */ @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { if (session.isOpen()) { session.close(); } logger.info("連接出錯"); } /** * 連線關閉 */ @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { //獲取使用者資訊 String userName = (String) session.getAttributes().get("userName"); if(socketMap.get(userName)!=null) { socketMap.remove(userName); //並且通過redis釋出和訂閱廣播給其他的的機器,或者通過訊息佇列 } logger.info("連線已關閉:" + status); } @Override public boolean supportsPartialMessages() { return false; } /** * 接受訂閱資訊 */ @Override public void receiveMessage(String message) { JSONObject sendMsg = JSONObject.fromObject(message.substring(message.indexOf("{"))); String clientId = sendMsg.getString("userName"); TextMessage receiveMessage = new TextMessage(sendMsg.getString("message")); boolean flag = sendMessageToUser(clientId, receiveMessage); if(flag) { logger.info("我傳送訊息成功了!"); } } }