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

首頁 > 開發 > Java > 正文

基于spring實現websocket實時推送實例

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

基于spring框架來寫的,websocket實時推送例子,具體內容如下

第一步:自己搭建一個springmvc項目,很簡單,網上百度都有;pom文件添加以下:

<!-- WebSocket -->  <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-websocket</artifactId>  <version>4.2.4.RELEASE</version>  </dependency>    <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-messaging</artifactId>  <version>4.2.4.RELEASE</version>  </dependency> 

我的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<String, WebSocketSession> userMap;  static {  userMap = new ConcurrentHashMap<String,WebSocketSession>(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<String> 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<String> 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里添加掃描包<context:component-scan base-package="com.zsy.websocket" />

 

/**  * 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<String, Object> 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"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <script type="text/javascript">  var websocket;  // 首先判斷是否 支持 WebSocket  if('WebSocket' in window) {  websocket = new WebSocket("ws://localhost:8085/springTest/testHandler?userId=zhaoshouyun");  } else if('MozWebSocket' in window) {  websocket = new MozWebSocket("ws://localhost:8085/springTest/testHandler?userId=zhaoshouyun");  } else {  websocket = new SockJS("http://localhost:8085/springTest/socketJs/testHandler?userId=zhaoshouyun");  }   // 打開連接時  websocket.onopen = function(evnt) {  console.log(" websocket.onopen ");  };   // 收到消息時  websocket.onmessage = function(evnt) {  alert(evnt.data);  };   websocket.onerror = function(evnt) {  console.log(" websocket.onerror ");  };   websocket.onclose = function(evnt) {  console.log(" websocket.onclose ");  };   function say(){  //客戶端主動發消息  websocket.send(document.getElementById('msg').value); }  </script> </head> <body> <input type="text" value="" id="msg"><button onclick="say()"></button> </body> </html> 

第六步測試:

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";  }   } 

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品igao视频| 欧美电影免费观看电视剧大全| 亚洲激情视频在线播放| 亚洲天堂av在线免费观看| 亚洲欧美精品伊人久久| 中文字幕在线看视频国产欧美在线看完整| 亚洲一区二区三区在线免费观看| 国产成人精品久久二区二区| 91国产精品91| 精品视频久久久久久| 国产精品精品久久久| 国产精品老女人视频| 国产精品a久久久久久| 欧美成年人视频网站欧美| 亚洲人成五月天| 久久精品青青大伊人av| 日韩高清人体午夜| 欧美一级片免费在线| 日韩电影免费观看中文字幕| 欧美激情视频三区| 精品自在线视频| 成人免费网站在线| 亚洲综合最新在线| 中文字幕欧美国内| 97视频在线观看网址| 98视频在线噜噜噜国产| 欧美精品第一页在线播放| 韩剧1988免费观看全集| 欧美老少做受xxxx高潮| 亚洲一区美女视频在线观看免费| 日韩中文字幕久久| 日韩欧美中文免费| 国产一区二区三区在线观看视频| 国产午夜精品一区二区三区| 欧美精品videosex极品1| 日韩精品在线观| 一区二区三区 在线观看视| 欧美日韩中文在线| 欧美日韩日本国产| 日本精品久久久久影院| 亚洲黄在线观看| 亚洲free性xxxx护士hd| 成人乱人伦精品视频在线观看| 亚洲精品资源美女情侣酒店| 色黄久久久久久| 久久精品国产一区二区三区| 在线精品91av| 国产精品自拍视频| 国产欧美日韩综合精品| 国产成人精品av在线| 情事1991在线| 欧美日韩国产中文精品字幕自在自线| 国产福利视频一区二区| 日韩欧美一区二区三区久久| 日韩在线观看免费av| 久久精品国产免费观看| 欧美理论电影网| 国产精品视频1区| 欧美性高潮在线| 日韩大胆人体377p| 黄色精品在线看| 91在线无精精品一区二区| 日韩欧美一区视频| 久久精品视频免费播放| 日韩精品中文在线观看| 亚洲激情电影中文字幕| 全球成人中文在线| 欧美xxxx综合视频| 日本亚洲欧洲色α| 日韩欧美精品免费在线| 国产91精品黑色丝袜高跟鞋| 4438全国成人免费| 视频一区视频二区国产精品| 亚洲国产天堂久久国产91| 久久99精品久久久久久琪琪| 亚洲一区二区黄| 国产一区在线播放| 国产美女精品视频| 2018中文字幕一区二区三区| 亚洲人成伊人成综合网久久久| 日韩激情av在线免费观看| 成人午夜小视频| 久久97精品久久久久久久不卡| 18性欧美xxxⅹ性满足| 国产精品欧美久久久| 亚洲国产小视频在线观看| 久久久久亚洲精品成人网小说| 国产91免费观看| 中文字幕亚洲第一| 欧美日韩一区二区免费在线观看| 亚洲免费人成在线视频观看| 韩国国内大量揄拍精品视频| 色婷婷成人综合| 法国裸体一区二区| 国产欧美精品一区二区| 欧美日韩国产限制| 亚洲欧美另类人妖| 欧美在线亚洲一区| 91中文字幕在线观看| 97视频在线观看亚洲| 91九色视频导航| 亚洲午夜av久久乱码| 亚洲精品成a人在线观看| 欧美一区二区色| 中文字幕久久久av一区| 久久九九国产精品怡红院| 91精品国产高清自在线看超| 中文字幕综合一区| 日韩成人激情在线| 日韩中文字幕在线免费观看| 欧美香蕉大胸在线视频观看| 亚洲欧洲一区二区三区在线观看| 日韩av黄色在线观看| 精品视频—区二区三区免费| 亚洲精品黄网在线观看| 午夜精品久久久久久久99黑人| 亚洲精品免费一区二区三区| 在线观看日韩av| 欧美在线视频一二三| 97精品国产97久久久久久春色| 最近2019中文字幕mv免费看| 国产亚洲精品激情久久| 91精品国产色综合久久不卡98| 成人天堂噜噜噜| 久久精品国产69国产精品亚洲| 精品国产欧美一区二区五十路| 国产精品午夜国产小视频| 久久久www成人免费精品张筱雨| 日韩精品视频在线播放| 精品福利樱桃av导航| 91九色国产社区在线观看| 亚洲精品久久久久久久久久久| 亚洲综合中文字幕68页| 欧美激情啊啊啊| 91免费看片网站| 91成人性视频| 欧美在线观看网址综合| 九色精品免费永久在线| 国产精品久久久久免费a∨大胸| 亚洲精品狠狠操| 成人免费视频网址| 亚洲色图国产精品| 日本亚洲精品在线观看| 精品视频在线播放| 中文字幕久热精品视频在线| 成人中文字幕+乱码+中文字幕| 热99精品只有里视频精品| 日韩精品有码在线观看| 亚洲国产古装精品网站| 日韩一区二区三区国产| 国产在线观看91精品一区| 久久天天躁夜夜躁狠狠躁2022| 欧美日韩中文字幕日韩欧美| 亚洲国产天堂久久综合网| 亚洲高清在线观看| 亚洲人永久免费| 国产精品久久久久久久久久久久| 中文字幕亚洲一区二区三区| 成人av电影天堂| 欧美激情中文字幕在线| 欧美日韩亚洲精品内裤| 综合欧美国产视频二区| 久久精品国产欧美激情| 亚洲第一男人av|