亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

SpringMVC整合websocket實現消息推送及觸發功能

2024-07-14 08:39:53
字體:
來源:轉載
供稿:網友

本文為大家分享了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,578888218@qq.com 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<br/>  *Description:  *@Company:  青島勵圖高科<br/>  *@author:  劉云生  *@version:  v1.0  *@since:   JDK 1.7.0_80  *@Date:   2016年9月3日 下午4:44:27 <br/> */ public class HandShake implements HandshakeInterceptor{    @Override   public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,       Map<String, Object> 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,578888218@qq.com 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<br/>  *Description:  *@Company:  青島勵圖高科<br/>  *@author:  劉云生  *@version:  v1.0  *@since:   JDK 1.7.0_80  *@Date:   2016年9月3日 下午4:52:29 <br/> */ @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,578888218@qq.com 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<br/>  *Description:  *@Company:  青島勵圖高科<br/>  *@author:  劉云生  *@version:  v1.0  *@since:   JDK 1.7.0_80  *@Date:   2016年9月3日 下午4:55:12 <br/> */ @Component public class MyWebSocketHandler implements WebSocketHandler{    public static final Map<String, WebSocketSession> userSocketSessionMap;    static {     userSocketSessionMap = new HashMap<String, WebSocketSession>();   }         @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<Entry<String, WebSocketSession>> it = userSocketSessionMap         .entrySet().iterator();     // 移除Socket會話     while (it.hasNext()) {       Entry<String, WebSocketSession> 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<Entry<String, WebSocketSession>> it = userSocketSessionMap         .entrySet().iterator();     // 移除Socket會話     while (it.hasNext()) {       Entry<String, WebSocketSession> 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<Entry<String, WebSocketSession>> it = userSocketSessionMap         .entrySet().iterator();      // 多線程群發     while (it.hasNext()) {        final Entry<String, WebSocketSession> 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<Entry<String, WebSocketSession>> it = userSocketSessionMap         .entrySet().iterator();      // 多線程群發     while (it.hasNext()) {        final Entry<String, WebSocketSession> 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握手處理的前臺

<script>   var path = '<%=basePath%>';   var userId = 'lys';   if(userId==-1){     window.location.href="<%=basePath2%>" rel="external nofollow" ;   }   var jspCode = userId+"_AAA";   var websocket;   if ('WebSocket' in window) {     websocket = new WebSocket("ws://" + path + "wsMy?jspCode=" + jspCode);   } else if ('MozWebSocket' in window) {     websocket = new MozWebSocket("ws://" + path + "wsMy?jspCode=" + jspCode);   } else {     websocket = new SockJS("http://" + path + "wsMy/sockjs?jspCode=" + jspCode);   }   websocket.onopen = function(event) {     console.log("WebSocket:已連接");     console.log(event);   };   websocket.onmessage = function(event) {     var data = JSON.parse(event.data);     console.log("WebSocket:收到一條消息-norm", data);     alert("WebSocket:收到一條消息");   };   websocket.onerror = function(event) {     console.log("WebSocket:發生錯誤 ");     console.log(event);   };   websocket.onclose = function(event) {     console.log("WebSocket:已關閉");     console.log(event);   } </script> 

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,578888218@qq.com 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<br/>  * Description:  *  * @Company: 青島勵圖高科<br/>  * @author: 劉云生  * @version: v1.0  * @since: JDK 1.7.0_80  * @Date: 2016年6月23日 下午3:23:46 <br/>  */ @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包

<dependency>     <groupId>org.springframework</groupId>     <artifactId>spring-websocket</artifactId>     <version>4.0.1.RELEASE</version> </dependency>  

5.運行的環境

至少tomcat8.0以上版本,否則可能報錯

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲综合中文字幕在线| 中文字幕亚洲综合久久| 九九热99久久久国产盗摄| 亚洲国产精品久久久| 国产精品91久久| 中文字幕国产亚洲| 亚洲国产日韩欧美在线99| 中文字幕免费精品一区高清| 福利二区91精品bt7086| 4444欧美成人kkkk| 91精品视频播放| 国产精品香蕉在线观看| 亚洲人高潮女人毛茸茸| 96sao精品视频在线观看| 国模精品系列视频| 日韩在线视频中文字幕| 欧美成人中文字幕在线| 成人黄色中文字幕| 日韩视频在线免费观看| 日本久久精品视频| 91精品免费久久久久久久久| 亚洲日本中文字幕免费在线不卡| 亚洲xxxxx| 日韩美女视频中文字幕| 7777免费精品视频| 91精品成人久久| 亚洲自拍偷拍网址| 成人黄色在线免费| 久久视频免费观看| 日日骚久久av| 亚洲美女av黄| 深夜精品寂寞黄网站在线观看| 91视频免费网站| 欧美成人激情视频| 欧美日韩亚洲一区二区三区| 成人激情视频在线观看| 欧美成人中文字幕在线| 9.1国产丝袜在线观看| 欧美视频一二三| 亚洲欧洲免费视频| 亚洲精品视频二区| 日韩欧美亚洲综合| www.日韩视频| 久久最新资源网| 中国日韩欧美久久久久久久久| 伊人激情综合网| 正在播放欧美一区| 国产精品视频一区二区三区四| 久久电影一区二区| 亚洲日本成人网| 在线性视频日韩欧美| 亚洲综合在线小说| 91chinesevideo永久地址| 亚洲理论在线a中文字幕| 日韩人体视频一二区| 91探花福利精品国产自产在线| 91av视频导航| 国产伦精品一区二区三区精品视频| 欧美性视频在线| 亚洲国产一区自拍| 97超碰蝌蚪网人人做人人爽| 成人妇女淫片aaaa视频| 亚洲字幕在线观看| 日韩av免费看网站| 一本大道香蕉久在线播放29| 亚洲www永久成人夜色| 久久精品99久久久久久久久| 精品无人区太爽高潮在线播放| 欧美一区二区三区图| 亚洲毛片在线观看.| 亚洲黄色av女优在线观看| 久久久久国产精品免费网站| 日本精品久久久久久久| 欧美日韩在线看| 亚洲天堂第二页| 午夜精品福利电影| 国产在线98福利播放视频| 欧美丰满少妇xxxx| 亚洲最大的网站| 精品国产视频在线| 亚洲欧美一区二区三区久久| 日韩动漫免费观看电视剧高清| 夜夜狂射影院欧美极品| 亚洲一区第一页| 精品女同一区二区三区在线播放| 欧美国产日韩一区| 国产精品高潮粉嫩av| 国产一区二区在线免费视频| 国自在线精品视频| 亚洲成人av在线| 伊人久久综合97精品| 久久久久久有精品国产| 欧美xxxx18性欧美| 久久成人精品电影| 日韩亚洲欧美中文在线| 国产丝袜一区二区| 亚洲欧美自拍一区| 亚洲深夜福利网站| 91社影院在线观看| 久久亚洲私人国产精品va| 国产精品欧美亚洲777777| 亚洲女在线观看| 91免费精品视频| 欧美午夜宅男影院在线观看| 欧美另类高清videos| 久久精品色欧美aⅴ一区二区| 国产精品成人观看视频国产奇米| 精品久久中文字幕| 国产视频丨精品|在线观看| 亚洲精品suv精品一区二区| 欧美成人免费va影院高清| 国产一区二区三区视频免费| 久久影视免费观看| 亚洲综合中文字幕在线| 亚洲午夜久久久久久久| 岛国精品视频在线播放| 日韩欧美成人精品| 日韩av综合中文字幕| 亚洲老司机av| 一区二区三区视频在线| 另类专区欧美制服同性| 亚洲一区亚洲二区| 欧美激情一区二区三区高清视频| 中文字幕视频一区二区在线有码| 亚洲精品福利在线观看| 日韩中文字幕精品| 亚洲伊人成综合成人网| 日韩美女免费线视频| 91在线视频免费| 日韩经典一区二区三区| 国产精品久久久久久久久借妻| 欧美专区福利在线| 欧美精品一区二区免费| 精品国产乱码久久久久久虫虫漫画| 亚洲精品一区二区三区婷婷月| 亚洲午夜av电影| 日韩av免费网站| 国产精品高潮呻吟久久av野狼| 日韩av电影国产| 亚洲国产精品久久久久| 成人黄色片在线| 欧美黑人性生活视频| 欧美激情乱人伦一区| 一区二区欧美亚洲| 国产午夜精品一区二区三区| 欧美日韩国产成人在线| 欧美成人精品激情在线观看| 国产一区二区三区欧美| 一区二区三区国产视频| 国产精品中文字幕在线| 中文字幕av一区二区三区谷原希美| 91精品久久久久久久久久久| 国产精品69久久久久| 亚洲精品av在线播放| 国产成人涩涩涩视频在线观看| 欧美国产日韩xxxxx| 久久中文精品视频| 91精品国产色综合久久不卡98| 国产精品1234| 日韩黄在线观看| 国产福利精品av综合导导航| 亚洲成人动漫在线播放| 亚洲欧美日韩精品久久亚洲区| 福利视频第一区|