WebSocket实时推送消息

版权声明:未经允许,不得转载 https://blog.csdn.net/dhj199181/article/details/83537376

废话不多说,直接上代码,本人亲自测试,可以使用。

前台js代码:


var websocket;
var path = window.location.host+"/web-socket";
// 首先判断是否 支持 WebSocket
if('WebSocket' in window) {
    websocket = new WebSocket("ws://"+path+"/ws");
} else if('MozWebSocket' in window) {
    websocket = new MozWebSocket("ws://"+path+"/ws");
} else {
    websocket = new SockJS(window.location.origin+"/web-socket/socketJs/");
}

// 打开连接时
websocket.onopen = function(evnt) {
    console.log("  websocket.onopen  ");
};

// 收到消息时
websocket.onmessage = function(evnt) {
  console.log(evnt.data);
};

websocket.onerror = function(evnt) {
    console.log("  websocket.onerror  ");
};

websocket.onclose = function(evnt) {
    console.log("  websocket.onclose  ");
}

后台java代码

WebSocketConfig.java

@Configuration
@EnableWebMvc
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer{

	@Autowired
	private SocketHandler socketHandler;
	
	@Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(socketHandler, "/ws").addInterceptors(new HttpSessionHandshakeInterceptor());  
        registry.addHandler(socketHandler, "/sockjs/socketServer").addInterceptors(new HttpSessionHandshakeInterceptor()).withSockJS(); 
    }
}

WebSocketInterceptor.java

public class WebSocketInterceptor implements HandshakeInterceptor{
		 private static final  Log log=LogFactory.getLog(WebSocketInterceptor.class);

	    @Override
	    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler, Exception exceptions) {
	        log.info("=================执行 afterHandshake :handler: "+handler+"exceptions: "+exceptions);
	    }


	    @Override
	    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler,
	            Map<String, Object> map) throws Exception {
	        log.info("==================执行 beforeHandshake :handler: "+handler+"map: "+map.values());
	        if(request instanceof ServerHttpRequest){
	            ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
	            HttpSession session = servletRequest.getServletRequest().getSession();
	            if(session!=null){
	                User user=(User)session.getAttribute("user");
	    	        log.info("==================user== "+user);
	                map.put(user.getUserName(), user);
	            }
	        }
	        return true;
	    }

}

SocketHandler.java

@Service
public class SocketHandler implements WebSocketHandler{

	 private static final  Log log=LogFactory.getLog(SocketHandler.class);
	    private static final  Map<String,WebSocketSession> userMap;
	    //在线用户
	    static {  
	        userMap = new HashMap<>();  
	    }
	
	@Override
	public void afterConnectionClosed(WebSocketSession session, CloseStatus arg1) throws Exception {
		log.info("Websocket:"+session.getId()+"已经关闭!");
        String userId=this.getUserName(session);
        if(userMap.get(userId) != null){
            userMap.remove(userId);
            log.info("Websocket:"+userId+"用户已经移除!");
        }
		
	}

	@Override
	public void afterConnectionEstablished(WebSocketSession session) throws Exception {
		String userId=this.getUserName(session);
        if(userMap.get(userId) == null){
            userMap.put(userId, session);
            log.info("Websocket:"+userId+"用户建立连接成功!");
        }else{
            log.info("Websocket:"+userId+"用户已经连接!");
        }
		
	}

	@Override
	public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
		session.sendMessage(message);  
        log.info("Websocket:handleMessage send message:"+message);
		
	}

	@Override
	public void handleTransportError(WebSocketSession arg0, Throwable error) throws Exception {
		log.error("Websocket:handleMessage send message:"+error);
		
	}

	@Override
	public boolean supportsPartialMessages() {
		return false;
	}
	
	public void sendMessageToUser(String userId, TextMessage message) {
        WebSocketSession session = userMap.get(userId);  
        if(session !=null && session.isOpen()) {  
            try {  
                session.sendMessage(message);  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }
    }


    /**
     * @Title: sendMessageToUsers 
     * @Description: 给所有用户发送信息
     * @param @param message
     * @return void
     * @date createTime:2018年4月26日上午9:44:33
     */
    public void sendMessageToUsers(String msg) {
    	TextMessage message = new TextMessage(msg);
        Set<String> userIds = userMap.keySet();  
        for(String userId: userIds) {  
            this.sendMessageToUser(userId, message);  
        }  
    }



    /**
     * @Title: getUserId 
     * @Description: 获取用户id
     * @param @param session
     * @param @return
     * @return String
     * @date createTime:2018年4月26日上午9:44:59
     */
    public String getUserName(WebSocketSession session){  
        Object obj = session.getAttributes().get("user");
        if(obj instanceof User){
        	User user = (User) obj;
        	return user.getUserName();
        }
        return null;
    } 
    
    public void sendMessage(Object object) {
    	TextMessage message = new TextMessage(JSONObject.toJSONString(object));
        Set<String> userIds = userMap.keySet();  
        for(String userId: userIds) {  
            this.sendMessageToUser(userId, message);  
        }  
    }
}

猜你喜欢

转载自blog.csdn.net/dhj199181/article/details/83537376