package com.hg.ecommerce.websocket; import org.springframework.web.socket.BinaryMessage; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.AbstractWebSocketHandler; import com.hg.ecommerce.websocket.support.Socket; import com.hg.ecommerce.websocket.support.SocketErrorPayload; import com.hg.ecommerce.websocket.support.SocketMessage; /** * WebSocket Event Driven Handler, all the event-driven handler should * derived from this one * @author Li He * */ public abstract class WebSocketEventDrivenHandler extends AbstractWebSocketHandler { /** * Any Derived Class implement this method to bind events to the given socket object * @param socket */ public abstract void onConnection(final Socket socket); /** * 连接成功建立时此方法被调用 * 将session添加到ConnectionHub中,并检测用户是否注册connection事件,如果注册了,触发此事件 */ @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { Socket socket = ConnectionHub.cacheSocket(session); System.out.println("New Session:"+session.getId()+"\tNow The Connection Hub Socket Number:"+ConnectionHub.getActiveSocketCount()+"\tUUID:"+ConnectionHub.uuid); onConnection(socket); } /** * 连接结束时,此方法调用 */ @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { System.out.println("Close the Session: "+session.getId()+"\tfor:"+status.getCode()); System.out.println("ConnectionHub Active Session:"+(ConnectionHub.getActiveSocketCount()-1)); ConnectionHub.removeSocket(session.getId()); } /** * 消息到来时,此方法被调用 */ @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) { Socket socket = ConnectionHub.getSocket(session.getId()); if(socket==null){ socket = ConnectionHub.cacheSocket(session); } try { System.out.println("raw text message:\n\t"+message.getPayload()); SocketMessage socketMessage = ConnectionHub.transferMessage(message); System.out.println("raw message for event:"+socketMessage.getEventName()+"\n\t"+socketMessage.getPayload()); socket.performEvent(socketMessage.getEventName(), socketMessage.getPayload()); } catch (Exception exception){ SocketErrorPayload errorPayload = new SocketErrorPayload(); errorPayload.setErrorName(exception.getClass().getSimpleName()); errorPayload.setErrorDescription(exception.getMessage()); socket.emit("error", errorPayload); } } /** * 二进制消息到来时,此方法被调用 */ @Override protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception { } /** * transport异常被触发时,此方法调用 */ @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { } }