1.pom.xml引入jar包
<!--websocket通知--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-messaging</artifactId> <version>${spring.version}</version> </dependency>
2.SpringWebSocketHandlerInterceptor
package com.infore.common.websocket; import java.util.Map; import javax.servlet.http.HttpSession; 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; /** * @author Created by Caix.xu * @desc . * @date 2017/5/18-下午7:26 */ public class SpringWebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { // TODO Auto-generated method stub System.out.println("Before Handshake"); if (request instanceof ServletServerHttpRequest) { ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; HttpSession session = servletRequest.getServletRequest().getSession(false); //使用userName区分WebSocketHandler,以便定向发送消息 String userName = (String) session.getAttribute("SESSION_USERNAME"); if (userName == null) { userName = "default-system"; } attributes.put("WEBSOCKET_USERNAME", userName); } return super.beforeHandshake(request, response, wsHandler, attributes); } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { // TODO Auto-generated method stub super.afterHandshake(request, response, wsHandler, ex); } }
3.SpringWebSocketHandler
package com.infore.common.websocket; import java.io.IOException; import java.util.*; import org.apache.log4j.Logger; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; /** * @author Created by Caix.xu * @desc . * @date 2017/5/18-下午7:23 */ public class SpringWebSocketHandler extends TextWebSocketHandler { private static final Map<String, WebSocketSession> users;//这个会出现性能问题,最好用Map来存储,key用userid private static Logger logger = Logger.getLogger(SpringWebSocketHandler.class); static { users = new HashMap<String, WebSocketSession>(); } public SpringWebSocketHandler() { // TODO Auto-generated constructor stub } /** * 连接成功时候,会触发页面上onopen方法 */ public void afterConnectionEstablished(WebSocketSession session) throws Exception { // TODO Auto-generated method stub String userName = (String) session.getHandshakeAttributes().get("WEBSOCKET_USERNAME"); String sessionId = session.getId(); users.put(userName, session); System.out.println("connect to the websocket success......当前数量:"+users.size()); //这块会实现自己业务,比如,当用户登录后,会把离线消息推送给用户 //TextMessage returnMessage = new TextMessage("你将收到的离线"); //session.sendMessage(returnMessage); } /** * 关闭连接时触发 */ public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { logger.debug("websocket connection closed......"); String username= (String) session.getHandshakeAttributes().get("WEBSOCKET_USERNAME"); if(null == username){ System.out.println("用户"+username+"已退出!"); users.remove(session); } System.out.println("剩余在线用户"+users.size()); } /** * js调用websocket.send时候,会调用该方法 */ @Override protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { System.out.println("==========="+message); sendMessageToUsers(message); //super.handleTextMessage(session, message); } public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { if(session.isOpen()){session.close();} logger.debug("websocket connection closed......"); users.remove(session); } public boolean supportsPartialMessages() { return false; } /** * 给某个用户发送消息 * * @param userName * @param message */ public void sendMessageToUser(String userName, TextMessage message) { /*for (WebSocketSession user : users) { if (user.getHandshakeAttributes().get("WEBSOCKET_USERNAME").equals(userName)) { try { if (user.isOpen()) { user.sendMessage(message); } } catch (IOException e) { e.printStackTrace(); } break; } }*/ } /** * 给所有在线用户发送消息 * * @param message */ public void sendMessageToUsers(TextMessage message) throws IOException { for (String map: users.keySet()) { WebSocketSession user = users.get(map); if (user.isOpen()) { user.sendMessage(message); } } } }
4.SpringWebSocketConfig
package com.infore.common.websocket; /** * @author Created by Caix.xu * @desc . * @date 2017/5/18-下午7:22 */ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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; import org.springframework.web.socket.handler.TextWebSocketHandler; @Configuration @EnableWebMvc @EnableWebSocket public class SpringWebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(webSocketHandler(),"/websocket/socketServer.do").addInterceptors(new SpringWebSocketHandlerInterceptor()); registry.addHandler(webSocketHandler(), "/sockjs/socketServer.do").addInterceptors(new SpringWebSocketHandlerInterceptor()).withSockJS(); } @Bean public TextWebSocketHandler webSocketHandler(){ return new SpringWebSocketHandler(); } }
5.WebsocketController
package com.infore.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.infore.common.websocket.SpringWebSocketHandler; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.socket.TextMessage; /** * @author Created by Caix.xu * @desc . * @date 2017/5/18-下午7:27 */ @Controller @RequestMapping("websocket") public class WebsocketController { @Bean//这个注解会从Spring容器拿出Bean public SpringWebSocketHandler infoHandler() { return new SpringWebSocketHandler(); } @RequestMapping("/login") public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception { String username = request.getParameter("username"); System.out.println(username+"登录"); HttpSession session = request.getSession(false); session.setAttribute("SESSION_USERNAME", username); //response.sendRedirect("/quicksand/jsp/websocket.jsp"); return new ModelAndView("websocket"); } @RequestMapping("/send") @ResponseBody public String send(HttpServletRequest request) { String username = request.getParameter("username"); infoHandler().sendMessageToUser(username, new TextMessage("你好,测试!!!!")); return null; } }
6.websocket.html
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <script type="text/javascript" src="http://cdn.bootcss.com/jquery/3.1.0/jquery.min.js"></script> <script type="text/javascript" src="http://cdn.bootcss.com/sockjs-client/1.1.1/sockjs.js"></script> <script type="text/javascript"> debugger; var websocket = null; if ('WebSocket' in window) { websocket = new WebSocket("ws://localhost:8080/websocket/socketServer.do"); } else if ('MozWebSocket' in window) { websocket = new MozWebSocket("ws://localhost:8080/websocket/socketServer.do"); } else { websocket = new SockJS("http://localhost:8080/sockjs/socketServer.do"); } websocket.onopen = onOpen; websocket.onmessage = onMessage; websocket.onerror = onError; websocket.onclose = onClose; function onOpen(openEvt) { //alert(openEvt.Data); } function onMessage(evt) { debugger; alert(evt.data); } function onError() {} function onClose() {} function doSend() { if (websocket.readyState == websocket.OPEN) { var msg = document.getElementById("inputMsg").value; websocket.send(msg);//调用后台handleTextMessage方法 alert("发送成功!"); } else { alert("连接失败!"); } } window.close=function() { websocket.onclose(); } </script> 请输入:<textarea rows="5" cols="10" id="inputMsg" name="inputMsg"></textarea> <button onclick="doSend();">发送</button> </body> </html>
done;
相关推荐
在Android平台上,利用WebSocket实现消息推送,可以让应用程序实时接收服务器端发送的数据,例如社交应用的新消息通知、股票市场的实时更新等。 一、WebSocket简介 WebSocket协议是在HTTP的基础上建立的持久连接...
SpringMVC整合websocket实现消息推送及触发功能 SpringMVC是一种流行的基于Java的Web应用程序框架,而websocket是一种实时通信协议,用于实现实时的双向通信。本文将详细介绍如何使用SpringMVC与websocket实现消息...
本文将探讨如何结合SpringBoot和WebSocket技术来实现消息推送和简单的聊天功能。 首先,要理解WebSocket协议的核心特性。WebSocket是一种在单个TCP连接上进行全双工通信的协议,它允许服务器和客户端之间进行持久...
通过WebSocket实现实时通信,结合定时任务管理,可实现灵活的消息推送和任务控制。 使用人群:适合有Spring Boot开发经验、了解WebSocket和定时任务管理的开发人员。希望在实时通信场景中实现消息推送和动态任务管理...
在"Spring Boot 整合 Netty + WebSocket 实时消息推送"项目中,我们主要关注以下几个核心知识点: 1. **Spring Boot集成WebSocket**:Spring Boot提供了Spring WebSocket模块,可以方便地集成WebSocket功能。通过...
在本主题中,我们将深入探讨“python-websocket-socket 消息推送”的相关知识点。 1. WebSocket API: WebSocket 是一种在客户端和服务器之间建立持久连接的协议,它允许双方进行全双工通信,即数据可以在任何方向...
(1)在项目中需要给页面一直推送消息 (2)定期给页面推送相应的数据信息 涉及技术: SpringBoot、WebSocket、定时器、日志、maven 开发工具: Idea 测试可使用Websocket在线模拟请求工具,链接如下: ...
实时推送部分,WebSocket允许服务器主动向客户端推送消息,而无需客户端持续发送轮询请求。这样,当后台有新数据或事件发生时,服务器可以直接将这些信息推送到已连接的客户端,避免了不必要的网络开销和延迟。 在...
5. **插件集成**:在若依框架中,可能会有一些现成的WebSocket插件可以简化集成过程,提供开箱即用的功能,例如消息推送、权限控制等。这些插件可能会提供图形化的配置界面,使得开发者无需编写过多代码就能完成...
在Spring Boot框架中使用WebSocket实现消息推送,是一种常见的实时通信技术,允许服务器主动向客户端推送数据。WebSocket协议提供了全双工的通信渠道,相较于传统的HTTP请求-响应模式,它能显著减少延迟并提高效率。...
如何使用Postman来发送数据到后端Spring Boot应用程序,并使用WebSocket建立实时通信通道,以便后端应用程序可以向Postman推送消息。 学会这个方法,就能缩短你的项目开发周期,以及提高你的开发效率。如果提出您的...
所以采用 rabbitMQ+webSocket实现分布式消息推送 生产者将消息 发送给 rabbitMQ 的 virtual-host:/(顶极路由) 再由它路由到交换机 最终由交换机通过路由键指定具体的管道 消费者监听指定的管道获取消息 最终将...
总结,本项目通过Java整合WebSocket,实现了服务器端主动向客户端推送消息的功能。开发者可以通过源码学习到WebSocket的基本用法,包括创建端点、处理连接和消息事件,以及在Servlet容器中的部署配置。此外,源码还...
本文将深入探讨如何使用C#语言结合Apollo代理服务器来实现C#与Android设备之间的消息推送。Apollo是一款开源的消息中间件,它提供了高可用、高性能的消息传递服务,广泛应用于分布式系统中。 首先,我们需要了解C#...
在Python的Web框架Django中,我们可以利用第三方库如`dwebsocket`来实现WebSocket功能,创建实时的消息推送和聊天室应用。 **一、WebSocket基础知识** WebSocket是一种在单个TCP连接上进行全双工通信的协议。它在...
在这个"WebSocket 实现实时推送的例子(工厂模式,回调机制)"中,我们将深入探讨如何利用WebSocket来构建一个实时推送系统,并结合工厂模式和回调机制来增强其灵活性和可维护性。 首先,让我们了解一下**工厂模式*...
本文将深入探讨如何在Spring Boot项目中实现WebSocket的消息推送,包括群发和指定到个人或多人。 首先,我们需要在Spring Boot项目中引入WebSocket的相关依赖。通常,我们会添加`spring-websocket`和`spring-...
6. **服务器推送**:在业务逻辑中,当需要向所有客户端推送消息时,可以通过`WebSocketService`的`sessions`集合找到所有在线用户,然后向每个用户的WebSocketSession发送消息: ```java @Autowired private ...
JAVA整合WebSocket实现服务器消息推送(项目源码) (1)将Database文件夹中的扩展名为db_netExam_Data.MDF和db_netExam_Log.LDF的两个文件拷贝到SQL Server安装路径下的Data文件夹中。 (2)打开SQL Server 2005中的...
以下是使用这些技术实现WebSocket消息推送的基本步骤: 1. **配置WebSocket**:在Spring的配置文件中启用WebSocket,配置WebSocket端点,并指定处理WebSocket消息的处理器。 2. **创建WebSocket端点**:创建一个...