基于spring实现websocket实时推送实例

这篇文章主要为大家详细介绍了基于spring实现websocket实时推送实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

基于spring框架来写的,websocket实时推送例子,具体内容如下

第一步:自己搭建一个springmvc项目,很简单,网上百度都有;pom文件添加以下:

  org.springframeworkspring-websocket4.2.4.RELEASE org.springframeworkspring-messaging4.2.4.RELEASE

我的spring版本是4.2.4的,所以websocket也是4.2.4的;websocket最好和spring版本保持一致

第二步:编写消息处理器

 /** * Project Name:springRabbitMQ * File Name:MyMessageHandler.java * Package Name:com.zsy.websocket * Date:2018年1月31日上午11:10:03 * Copyright (c) 2018, zhaoshouyun All Rights Reserved. * */ package com.zsy.websocket; import java.io.IOException; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.lang3.StringUtils; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.WebSocketMessage; import org.springframework.web.socket.WebSocketSession; /** * ClassName: MyMessageHandler * Function: 实现webscoket接口 * date: 2018年1月31日 上午11:10:03 * @author zhaoshouyun * @version * @since JDK 1.7 */ public class MyMessageHandler implements WebSocketHandler { //用户key public static final String USER_KEY = "current_user"; /** * userMap:存储用户连接webscoket信息 * @since JDK 1.7 */ private final static Map userMap; static { userMap = new ConcurrentHashMap(30); } /** * 关闭websocket时调用该方法 * @see org.springframework.web.socket.WebSocketHandler#afterConnectionClosed(org.springframework.web.socket.WebSocketSession, org.springframework.web.socket.CloseStatus) */ @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { String userId = this.getUserId(session); if(StringUtils.isNoneBlank(userId)){ userMap.remove(userId); System.err.println("该" + userId +"用户已成功关闭"); }else{ System.err.println("关闭时,获取用户id为空"); } } /** * 建立websocket连接时调用该方法 * @see org.springframework.web.socket.WebSocketHandler#afterConnectionEstablished(org.springframework.web.socket.WebSocketSession) */ @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { String userId = this.getUserId(session); if(StringUtils.isNoneBlank(userId)){ userMap.put(userId, session); session.sendMessage(new TextMessage("建立WebSocket连接成功!")); } } /** * 客户端调用websocket.send时候,会调用该方法,进行数据通信 * @see org.springframework.web.socket.WebSocketHandler#handleMessage(org.springframework.web.socket.WebSocketSession, org.springframework.web.socket.WebSocketMessage) */ @Override public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { String msg = message.toString(); String userId = this.getUserId(session); System.err.println("该"+userId+"用户发送的消息是:"+msg); message = new TextMessage("服务端已经接收到消息,msg="+msg); session.sendMessage(message); } /** * 传输过程出现异常时,调用该方法 * @see org.springframework.web.socket.WebSocketHandler#handleTransportError(org.springframework.web.socket.WebSocketSession, java.lang.Throwable) */ @Override public void handleTransportError(WebSocketSession session, Throwable e) throws Exception { WebSocketMessage message = new TextMessage("异常信息:"+e.getMessage()); session.sendMessage(message); } /** * * @see org.springframework.web.socket.WebSocketHandler#supportsPartialMessages() */ @Override public boolean supportsPartialMessages() { return false; } /** * sendMessageToUser:发给指定用户 * @author zhaoshouyun * @param userId * @param contents * @since JDK 1.7 */ public void sendMessageToUser(String userId,String contents) { WebSocketSession session = userMap.get(userId); if(session !=null && session.isOpen()) { try { TextMessage message = new TextMessage(contents); session.sendMessage(message); } catch (IOException e) { e.printStackTrace(); } } } /** * sendMessageToAllUsers:发给所有的用户 * @author zhaoshouyun * @param contents * @since JDK 1.7 */ public void sendMessageToAllUsers(String contents) { Set userIds = userMap.keySet(); for(String userId: userIds) { this.sendMessageToUser(userId, contents); } } /** * getUserId:获取用户id * @author zhaoshouyun * @param session * @return * @since JDK 1.7 */ private String getUserId(WebSocketSession session){ try { String userId = (String)session.getAttributes().get(USER_KEY); return userId; } catch (Exception e) { e.printStackTrace(); } return null; } }

 第三步:编写websocket相关配置,当然可以在xml配置;我现在没有使用xml配置,使用代码配置,需要在xml里添加扫描包

 

 /** * Project Name:springRabbitMQ * File Name:WebSocketConfig.java * Package Name:com.zsy.websocket * Date:2018年1月31日下午1:10:33 * Copyright (c) 2018, zhaoshouyun All Rights Reserved. * */ /** * Project Name:springRabbitMQ * File Name:WebSocketConfig.java * Package Name:com.zsy.websocket * Date:2018年1月31日下午1:10:33 * Copyright (c) 2018, zhaoshouyun All Rights Reserved. * */ package com.zsy.websocket; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; /** * ClassName: WebSocketConfig * Function: TODO ADD FUNCTION. * date: 2018年1月31日 下午1:10:33 * @author zhaoshouyun * @version * @since JDK 1.7 */ @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { /** * 注册handle * @see org.springframework.web.socket.config.annotation.WebSocketConfigurer#registerWebSocketHandlers(org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry) */ @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), "/testHandler").addInterceptors(new WebSocketInterceptor()); registry.addHandler(myHandler(), "/socketJs/testHandler").addInterceptors(new WebSocketInterceptor()).withSockJS(); } @Bean public WebSocketHandler myHandler(){ return new MyMessageHandler(); } } 

第四步:编写websocket适配器

 package com.zsy.websocket; import java.util.Map; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.http.server.ServletServerHttpRequest; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor; /** * ClassName: WebSocketInterceptor * Function: TODO ADD FUNCTION. * date: 2018年1月31日 上午11:42:34 * @author zhaoshouyun * @version * @since JDK 1.7 */ public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor { /** * TODO 简单描述该方法的实现功能(可选). * @see org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor#beforeHandshake(org.springframework.http.server.ServerHttpRequest, org.springframework.http.server.ServerHttpResponse, org.springframework.web.socket.WebSocketHandler, java.util.Map) */ @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { if(request instanceof ServletServerHttpRequest){ ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest)request; //获取参数 String userId = serverHttpRequest .getServletRequest().getParameter("userId"); attributes.put(MyMessageHandler.USER_KEY, userId); } return true; } } 

第五步对应的js:

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>  Insert title here 

第六步测试:

 package com.zsy.test.controller; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.zsy.websocket.MyMessageHandler; /** * ClassName: TestController * Function: TODO ADD FUNCTION. * date: 2017年12月14日 上午11:11:23 * @author zhaoshouyun * @version * @since JDK 1.7 */ @Controller public class TestController { @Autowired MyMessageHandler handler; @RequestMapping("/get") public String get(){ return "index"; } @ResponseBody @RequestMapping("/get1") public String send(String name){ handler.sendMessageToUser("zhaoshouyun", "服务端发送的内容:"+name); return "success"; } } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持html中文网。

以上就是基于spring实现websocket实时推送实例的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Java