看了好多网上能搜到的spring mvc实现websocket的教程,总算淌出了坑,搞出来一个比较纯粹的实现websocket的Demo。

项目运行后,可以启动一个页面进行登录,然后在另一个页面中向服务器发送请求,服务器再向登录的页面推送消息。

启动页面登录:http://127.0.0.1:8080/jyl/login/jyl

login后是用户名,登录后页面效果如图

再使用另一页面向服务器发送请求,请求中包含数据,服务器将消息推送到已登录的页面中,已登录页面将刷新出内容

请求为:127.0.0.1:8080/jyl/msg/jyl/我要发消息了

msg后为:/用户名/消息内容

需要源码的请这里下载:https://download.csdn.net/download/jiyanglin/10972609

废话不多说,直接上代码。。。

maven依赖

下面这些就够了

     <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.1.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.1.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>4.1.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>4.1.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-websocket</artifactId><version>4.1.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-messaging</artifactId><version>4.1.9.RELEASE</version></dependency>

jsp页面

<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jyl</title>
</head>
<body><textarea id="txtContent" cols="50" rows="10" readonly="readonly"></textarea>
</body>
<script>var ws = new WebSocket("ws://"+window.location.host+"/jyl/myHandler");ws.onopen = function () {};ws.onclose = function (event) {};ws.onmessage = function (event) {document.getElementById("txtContent").value = event.data;console.log(event.data);};
</script>
</html>

websocket核心类

WebSocketInterceptor

package com.jyl.ws;import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;import javax.servlet.http.HttpSession;
import java.util.Map;@Component
public class WebSocketInterceptor implements HandshakeInterceptor {public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler handler,Map<String, Object> map) throws Exception {if (request instanceof ServletServerHttpRequest) {ServletServerHttpRequest serverHttpRequest = (ServletServerHttpRequest) request;HttpSession session = serverHttpRequest.getServletRequest().getSession();if (session != null) {map.put(MyHandler.CLIENT_ID, session.getAttribute("username"));}else{return false;}}return true;}public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse,WebSocketHandler webSocketHandler, Exception e) {}
}

MyHandler

package com.jyl.ws;import org.springframework.stereotype.Service;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;@Service
public class MyHandler extends TextWebSocketHandler {private static final Map<String, WebSocketSession> users;public static final String CLIENT_ID = "username";static {users = new HashMap<String, WebSocketSession>();}@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {String username= getClientId(session);if (username != null) {users.put(username, session);session.sendMessage(new TextMessage("成功建立socket连接"));System.out.println("建立连接:" + username);}}@Overridepublic void handleTextMessage(WebSocketSession session, TextMessage message) {try {System.out.println(message.getPayload());WebSocketMessage msg = new TextMessage("server:"+message);session.sendMessage(msg);} catch (IOException e) {e.printStackTrace();}}public boolean sendMessageToUser(String clientId, TextMessage message) {if (users.get(clientId) == null) return false;WebSocketSession session = users.get(clientId);System.out.println("sendMessage:" + session);if (!session.isOpen()) return false;try {session.sendMessage(message);} catch (IOException e) {System.out.println(e);return false;}return true;}public boolean sendMessageToAllUsers(TextMessage message) {Set<String> clientIds = users.keySet();WebSocketSession session = null;for (String clientId : clientIds) {try {session = users.get(clientId);if (session.isOpen()) {session.sendMessage(message);}} catch (IOException e) {e.printStackTrace();return  false;}}return  true;}private String getClientId(WebSocketSession session) {try {String clientId = (String) session.getAttributes().get(CLIENT_ID);return clientId;} catch (Exception e) {return null;}}@Overridepublic void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {if (session.isOpen()) {session.close();}System.out.println("连接出错");users.remove(getClientId(session));}@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {System.out.println("连接已关闭:" + status);users.remove(getClientId(session));}@Overridepublic boolean supportsPartialMessages() {return false;}
}

WebSocketConfig

package com.jyl.ws;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 {public void registerWebSocketHandlers(WebSocketHandlerRegistry registry){registry.addHandler(myHandler(), "/myHandler").addInterceptors(new WebSocketInterceptor()).setAllowedOrigins("*");}@Beanpublic WebSocketHandler myHandler() {return new MyHandler();}
}

controller

package com.jyl.controller;import javax.servlet.http.HttpSession;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.socket.TextMessage;import com.jyl.ws.MyHandler;@Controller
public class JylController {@AutowiredMyHandler handler;@RequestMapping("/login/{username}")public String  login(HttpSession session, @PathVariable("username") String username) {session.setAttribute(MyHandler.CLIENT_ID, username);System.out.println("登录:" + session.getAttribute(MyHandler.CLIENT_ID));return "jyl";}@RequestMapping("/msg/{username}/{msg}")public @ResponseBody String sendMessage(@PathVariable("username") String username,@PathVariable("msg") String msg) {        handler.sendMessageToUser(username, new TextMessage(msg));return "";}
}

配置

web.xml

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

spring-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:p="http://www.springframework.org/schema/p"  xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="  http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"> <mvc:annotation-driven/>
<context:component-scan base-package="com.jyl.controller"/>
<mvc:default-servlet-handler/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
<property name="order" value="20"/>
</bean>
</beans>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="  http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><tx:annotation-driven /><context:component-scan base-package="com.jyl.ws" /></beans>

spring mvc 实现websocket(服务器主动消息推送)相关推荐

  1. WebSocket实现android消息推送

    WebSocket实现android消息推送 WebSocket是HTML5出的协议,基于TCP.它实现了浏览器与服务器全双工(full-duplex)通信--允许服务器主动发送信息给客户端. Web ...

  2. springboot整合websocket实现一对一消息推送和广播消息推送

    springboot基础环境,请参考springboot文档 maven依赖 <dependency><groupId>org.springframework.boot< ...

  3. go语言消息推送服务器,Golang 消息推送系统

    ## Golang 消息推送系统 - 使用 websocket 协议,实现全局推送,和分房间推送,实现用户加入房间,退出房间 - gateway 长连接网关服务器,管理全部的链接,以及房间等相关操作 ...

  4. 苹果消息是先推送到服务器,iPhone消息推送机制实现与探讨

    http://www.cocoachina.com/iphonedev/sdk/2011/1124/3599.html 最近两天在研究ios的消息推送机制.研究这个东西,还是充满兴趣的. Push的原 ...

  5. mpush 搭建消息服务器,MPUSH消息推送服务器搭建

    MPUSH消息推送服务器搭建 安装JDK 1.8 wget /jdk-8u121-linux-x64.tar.gz tar -zxvf jdk-8u121-linux-x64.tar.gz vim / ...

  6. 拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能

    一.写在前面 要求做一个,后台发布信息,前台能即时得到通知的消息推送功能.网上搜了也有很多方式,ajax的定时询问,Comet方式,Server-Sent方式,以及websocket.表示除了定时询问 ...

  7. springboot+websocket+sockjs进行消息推送【基于STOMP协议】

    1.浅谈WebSocket WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就可以建立一条快速通道,两者就可以实现数据互传了.说白了,就是打 ...

  8. c# 实现 Server-Sent Events (SSE),服务器单方面消息推送 [案例版]

    游览器通讯技术其实有很多,相较于 WebSocket 而言,Server-Sent Events (简称SSE)更少被人知晓,具体实践也较少. 但是,实现却是简单的,其中 IE / Edge 几乎根本 ...

  9. Django:使用channels创建websocket,实现消息推送

    感谢:(1)Django+channels配置与编写:https://blog.csdn.net/weixin_40105587/article/details/87375886 (2)Django+ ...

  10. 苹果百度手机消息推送服务器,苹果消息推送服务教程

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 创建PEM文件 现在我们总共有三个文件: CSR 私有密钥(PushChatKey.p12) SSL证书(aps_developer_identity.c ...

最新文章

  1. 一群热爱python运维的精英们!
  2. chrome 适配调试_移动端适配
  3. 从源码深处体验Spring核心技术--基于Xml的IOC容器的初始化
  4. 搭建IC设计EDA虚拟机服务器,忆往昔--集成门控时钟技术的前世--分离门控时钟技术...
  5. php class setter,设置器 - Setters《 PHP 面向对象 》
  6. 简单网页设计模板html代码
  7. keil+proteus 制作计算器_设计费 | 工程设计费计算器使用指南
  8. Bugku CTF 每日一题 想蹭网先解开密码
  9. i yfiygol hul hl
  10. 老旗舰华为能用上鸿蒙吗,千元机也能用鸿蒙!曝荣耀 9X 手机年内全部升级鸿蒙系统...
  11. 提升深度学习模型的表现,你需要这20个技巧
  12. Data structure you've never heard of(枚举+dp)
  13. mac book外接4k 显示器 字体大小问题
  14. 转载老码农教你学英语
  15. python/gdal处理遥感影像(读取、投影转换、裁剪、建立图像金字塔等)
  16. 面经九2023.2.3上午笔试和群面
  17. 整理弱网测试时碰到的问题和解决方案
  18. 车易加加油优惠卡_丰田Supra GRMN或2023年发布可 能搭载宝马3.0T发动机
  19. LCD中文字模编译前自动提取的方法
  20. 高防服务器ddos压力测试的工具推荐

热门文章

  1. Webstorm配置运行React Native
  2. Andrew ng 深度学习课程笔记
  3. Js+fromdata
  4. 跟着百度学PHP[3]-PHP中结构嵌套之循环结构与条件结构嵌套
  5. 谈谈JS的全局变量跟局部变量
  6. XenApp / XenDesktop 7.6 初体验一   安装, 配置站点和序列号服务器
  7. 企业网站电子邮件营销的优势与转化率分析
  8. 跟着锅子一步步学习32位汇编(1)---第一个汇编程序
  9. php monolog 使用,PHP 依赖工具 monolog的使用
  10. linux子系统gdp调试,GDB调试命令_Linux编程_Linux公社-Linux系统门户网站