SpringMVC整合websocket实现消息推送及触发功能

本文为大家分享了SpringMVC整合websocket实现消息推送,供大家参考,具体内容如下

1.创建websocket握手协议的后台

(1)HandShake的实现类

/** 
 *Project Name: price 
 *File Name:  HandShake.java 
 *Package Name: com.yun.websocket 
 *Date:     2016年9月3日 下午4:44:27 
 *Copyright (c) 2016,[email protected] All Rights Reserved. 
*/ 
 
package com.yun.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.HandshakeInterceptor; 
 
/** 
 *Title:   HandShake
*Description: *@Company: 青岛励图高科
*@author: 刘云生 *@version: v1.0 *@since: JDK 1.7.0_80 *@Date: 2016年9月3日 下午4:44:27
*/ public class HandShake implements HandshakeInterceptor{ @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map attributes) throws Exception { // TODO Auto-generated method stub String jspCode = ((ServletServerHttpRequest) request).getServletRequest().getParameter("jspCode"); // 标记用户 //String userId = (String) session.getAttribute("userId"); if(jspCode!=null){ attributes.put("jspCode", jspCode); }else{ return false; } return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) { // TODO Auto-generated method stub } }

(2)MyWebSocketConfig的实现类

/** 
 *Project Name: price 
 *File Name:  MyWebSocketConfig.java 
 *Package Name: com.yun.websocket 
 *Date:     2016年9月3日 下午4:52:29 
 *Copyright (c) 2016,[email protected] All Rights Reserved. 
*/ 
 
package com.yun.websocket; 
 
import javax.annotation.Resource; 
 
import org.springframework.stereotype.Component; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.socket.config.annotation.EnableWebSocket; 
import org.springframework.web.socket.config.annotation.WebSocketConfigurer; 
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; 
 
/** 
 *Title:   MyWebSocketConfig
*Description: *@Company: 青岛励图高科
*@author: 刘云生 *@version: v1.0 *@since: JDK 1.7.0_80 *@Date: 2016年9月3日 下午4:52:29
*/ @Component @EnableWebMvc @EnableWebSocket public class MyWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer{ @Resource MyWebSocketHandler handler; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { // TODO Auto-generated method stub registry.addHandler(handler, "/wsMy").addInterceptors(new HandShake()); registry.addHandler(handler, "/wsMy/sockjs").addInterceptors(new HandShake()).withSockJS(); } }

(3)MyWebSocketHandler的实现类

/** 
 *Project Name: price 
 *File Name:  MyWebSocketHandler.java 
 *Package Name: com.yun.websocket 
 *Date:     2016年9月3日 下午4:55:12 
 *Copyright (c) 2016,[email protected] All Rights Reserved. 
*/ 
 
package com.yun.websocket; 
 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Map.Entry; 
 
import org.springframework.stereotype.Component; 
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; 
 
import com.google.gson.GsonBuilder; 
 
/** 
 *Title:   MyWebSocketHandler
*Description: *@Company: 青岛励图高科
*@author: 刘云生 *@version: v1.0 *@since: JDK 1.7.0_80 *@Date: 2016年9月3日 下午4:55:12
*/ @Component public class MyWebSocketHandler implements WebSocketHandler{ public static final Map userSocketSessionMap; static { userSocketSessionMap = new HashMap(); } @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // TODO Auto-generated method stub String jspCode = (String) session.getHandshakeAttributes().get("jspCode"); if (userSocketSessionMap.get(jspCode) == null) { userSocketSessionMap.put(jspCode, session); } for(int i=0;i<10;i++){ //broadcast(new TextMessage(new GsonBuilder().create().toJson("\"number\":\""+i+"\""))); session.sendMessage(new TextMessage(new GsonBuilder().create().toJson("\"number\":\""+i+"\""))); } } @Override public void handleMessage(WebSocketSession session, WebSocketMessage message) throws Exception { // TODO Auto-generated method stub //Message msg=new Gson().fromJson(message.getPayload().toString(),Message.class); //msg.setDate(new Date()); // sendMessageToUser(msg.getTo(), new TextMessage(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create().toJson(msg))); session.sendMessage(message); } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { // TODO Auto-generated method stub if (session.isOpen()) { session.close(); } Iterator> it = userSocketSessionMap .entrySet().iterator(); // 移除Socket会话 while (it.hasNext()) { Entry entry = it.next(); if (entry.getValue().getId().equals(session.getId())) { userSocketSessionMap.remove(entry.getKey()); System.out.println("Socket会话已经移除:用户ID" + entry.getKey()); break; } } } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { // TODO Auto-generated method stub System.out.println("Websocket:" + session.getId() + "已经关闭"); Iterator> it = userSocketSessionMap .entrySet().iterator(); // 移除Socket会话 while (it.hasNext()) { Entry entry = it.next(); if (entry.getValue().getId().equals(session.getId())) { userSocketSessionMap.remove(entry.getKey()); System.out.println("Socket会话已经移除:用户ID" + entry.getKey()); break; } } } @Override public boolean supportsPartialMessages() { // TODO Auto-generated method stub return false; } /** * 群发 * @Title: broadcast * @Description: TODO * @param: @param message * @param: @throws IOException * @return: void * @author: 刘云生 * @Date: 2016年9月10日 下午4:23:30 * @throws */ public void broadcast(final TextMessage message) throws IOException { Iterator> it = userSocketSessionMap .entrySet().iterator(); // 多线程群发 while (it.hasNext()) { final Entry entry = it.next(); if (entry.getValue().isOpen()) { new Thread(new Runnable() { public void run() { try { if (entry.getValue().isOpen()) { entry.getValue().sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } } } /** * 给所有在线用户的实时工程检测页面发送消息 * * @param message * @throws IOException */ public void sendMessageToJsp(final TextMessage message,String type) throws IOException { Iterator> it = userSocketSessionMap .entrySet().iterator(); // 多线程群发 while (it.hasNext()) { final Entry entry = it.next(); if (entry.getValue().isOpen() && entry.getKey().contains(type)) { new Thread(new Runnable() { public void run() { try { if (entry.getValue().isOpen()) { entry.getValue().sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } } }).start(); } } } }

2.创建websocket握手处理的前台

 

3.通过Controller调用进行websocket的后台推送

/** 
 *Project Name: price 
 *File Name:  GarlicPriceController.java 
 *Package Name: com.yun.price.garlic.controller 
 *Date:     2016年6月23日 下午3:23:46 
 *Copyright (c) 2016,[email protected] All Rights Reserved. 
*/ 
 
package com.yun.price.garlic.controller; 
 
import java.io.IOException; 
import java.util.Date; 
import java.util.List; 
 
import javax.annotation.Resource; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpSession; 
 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 
import org.springframework.web.context.request.RequestContextHolder; 
import org.springframework.web.context.request.ServletRequestAttributes; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.socket.TextMessage; 
 
import com.google.gson.GsonBuilder; 
import com.yun.common.entity.DataGrid; 
import com.yun.price.garlic.dao.entity.GarlicPrice; 
import com.yun.price.garlic.model.GarlicPriceModel; 
import com.yun.price.garlic.service.GarlicPriceService; 
import com.yun.websocket.MyWebSocketHandler; 
 
/** 
 * Title: GarlicPriceController
* Description: * * @Company: 青岛励图高科
* @author: 刘云生 * @version: v1.0 * @since: JDK 1.7.0_80 * @Date: 2016年6月23日 下午3:23:46
*/ @Controller public class GarlicPriceController { @Resource MyWebSocketHandler myWebSocketHandler; @RequestMapping(value = "GarlicPriceController/testWebSocket", method ={RequestMethod.POST,RequestMethod.GET}, produces = "application/json; charset=utf-8") @ResponseBody public String testWebSocket() throws IOException{ myWebSocketHandler.sendMessageToJsp(new TextMessage(new GsonBuilder().create().toJson("\"number\":\""+"GarlicPriceController/testWebSocket"+"\"")), "AAA"); return "1"; } }

4.所用到的jar包

 
    org.springframework 
    spring-websocket 
    4.0.1.RELEASE 
  

5.运行的环境

至少tomcat8.0以上版本,否则可能报错

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

你可能感兴趣的:(SpringMVC整合websocket实现消息推送及触发功能)