栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

(1)HandShake的实现类

 
 
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; 
 
 
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的实现类

 
 
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; 
 
 
@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的实现类

 
 
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; 
 
 
@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; 
  } 
   
  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(); 
      } 
 
    } 
  } 
   
   
  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的后台推送

 
 
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; 
 
 
@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以上版本,否则可能报错

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/141269.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号