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

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

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

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

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

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

 
  
 org.springframework 
 spring-websocket 
 4.2.4.RELEASE 
  
 
 
  
 org.springframework 
 spring-messaging 
 4.2.4.RELEASE 
  

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

第二步:编写消息处理器

 
 
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; 
 
 
public class MyMessageHandler implements WebSocketHandler { 
 //用户key 
 public static final String USER_KEY = "current_user"; 
 
  
 private final static Map userMap; 
 static { 
 userMap = new ConcurrentHashMap(30); 
 } 
  
 @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为空"); 
  } 
 
 } 
 
  
 @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连接成功!")); 
 } 
 
 } 
 
  
 @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); 
 
 } 
 
  
 @Override 
 public void handleTransportError(WebSocketSession session, Throwable e) throws Exception { 
 WebSocketMessage message = new TextMessage("异常信息:"+e.getMessage()); 
 session.sendMessage(message); 
 } 
 
  
 @Override 
 public boolean supportsPartialMessages() { 
 
 return false; 
 } 
 
  
 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(); 
  } 
 } 
 } 
 
  
 public void sendMessageToAllUsers(String contents) { 
  Set userIds = userMap.keySet(); 
  for(String userId: userIds) { 
  this.sendMessageToUser(userId, contents); 
  } 
 } 
 
  
 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里添加扫描包

 

 
 
 
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; 
 
 
@Configuration 
@EnableWebSocket 
public class WebSocketConfig implements WebSocketConfigurer { 
 
  
 @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; 
 
 
public class WebSocketInterceptor extends HttpSessionHandshakeInterceptor { 
  
 @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; 
 
 
@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"; 
 } 
 
 
} 

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

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

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

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