package org.hsweb.web.socket; import com.alibaba.fastjson.JSON; import org.hsweb.web.bean.po.user.User; import org.hsweb.web.core.session.HttpSessionManager; import org.hsweb.web.socket.cmd.CMD; import org.hsweb.web.socket.cmd.CmdProcessor; import org.hsweb.web.socket.cmd.CmdProcessorContainer; import org.hsweb.web.socket.message.WebSocketMessageManager; import org.hsweb.web.socket.utils.SessionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; /** * 基于命令的socket处理器 * Created by 浩 on 2015-09-08 0008. */ @Component public class CmdWebSocketHandler extends TextWebSocketHandler { protected Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private HttpSessionManager httpSessionManager; private WebSocketMessageManager webSocketMessageManager; @Autowired private CmdProcessorContainer processorContainer; @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { if (logger.isInfoEnabled()) logger.info("handleMessage,id:{} msg={}", session.getId(), message.getPayload()); try { CMD request = JSON.parseObject(message.getPayload(), CMD.class); CmdProcessor processor = processorContainer.getCmdProcessor(request.getCmd()); if (null != processor) { request.setSession(session); processor.exec(request); } } catch (Exception e) { logger.error("handleTextMessage error!", e); } } private User getUser(WebSocketSession session) { return SessionUtils.getUser(session, httpSessionManager); } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { User user = getUser(session); if (user == null) { session.close(CloseStatus.BAD_DATA.withReason("请登陆!")); return; } session.getAttributes().put("user", user); webSocketMessageManager.onSessionConnect(session); for (CmdProcessor processor : processorContainer.getAll()) { processor.onSessionConnect(session); } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { webSocketMessageManager.onSessionClose(session); for (CmdProcessor processor : processorContainer.getAll()) { processor.onSessionClose(session); } } public void setWebSocketMessageManager(WebSocketMessageManager webSocketMessageManager) { this.webSocketMessageManager = webSocketMessageManager; } }