如何在Spring中配置springmvc4 websockett

更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
使用您的微博帐号登录,即刻尊享微博用户专属服务。
使用您的QQ帐号登录,即刻尊享QQ用户专属服务。
使用您的人人帐号登录,即刻尊享人人用户专属服务。
按住视频可进行拖动
把视频贴到Blog或BBS
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
收藏成功,可进入查看所有收藏列表
方式1:用手机看
用爱奇艺APP或微信扫一扫,在手机上继续观看:
spring websocket视频
方式2:一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/164eL4
下载安装包到本机:&&
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/164eL4
下载安装包到本机:&&
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
爸爸去哪儿2游戏 立即参与
spring websocket视频
播放量数据:
3,113人已订阅
你可能还想订阅他们:
&正在加载...
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
安装爱奇艺视频客户端,
马上开始为您下载本片
5秒后自动消失
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制&& &文章主题:
交流经验:0
总积分:100
级别:普通会员
Spring 4.0 中的 WebSocket 架构
两年前,客户端与服务器端的全双工双向通信作为一个很重要的功能被纳入到WebSocket
协议中。在HTML5中,WebSocket已经成为一个流行词,大家对这个功能赋予很多构想,很多时候甚至是不切实际的期望。在这篇文章中,我们将重点介绍下如何通过Spring Framework 4.0来构建一个基于
协议的WebSocket形式的应用。该应用通过
向用户广播消息,并使用SockJS作为浏览器前端通信代码库。传统的Socket交互需要很多项技术的支持,包括Java applet,XMLHttpRequest,Adobe Flash, ActiveXObject, 各种
Comet和服务端发送事件等等。相较于通过如此繁杂的技术来实现Socket交互,WebSockt就显得简洁易用得多了。但是别高兴得太早,无论看起来如何诱人,WebSocket现在都还只不过是一个基础而已。即便它确实为WEB的双向通信设定了一些重要的标准,但也还只是第一步。要成为一个成熟的Socket交互方案,WebSocket还需要解决网络代理设置和浏览器支持等一系列的问题。
WebSocket和REST对比
当你开始接触WebSocket应用时,为了找寻你可能会遇到的问题的答案,你就要快速地浏览一下这篇文章,基于不同的应用类型其中包含了关于WebSocket是否会替代REST的有趣而不可思议的讨论。该类型(WebSocket)应用相对于偶尔工作的应用(web邮件,新闻更新等)拥有更强大的能力来面对全天候,实时交互(比如游戏、金融、协作化、可视化等)的复杂情况,无论哪种方式,他都是通常人们所熟悉的,而且REST是我们目前通用的web应用构建风格.在此并非想通过这样的对比来抵制这些创新,还是让我们看看能从中学到什么吧,而这2个要点还是需要我们去观察才能发现的.
首先,与其他相比,REST是一种在使用无状态和超媒体(链接)时,支持许多URL和少量的HTTP方法的架构方式。与之对应的,WebSocket是一个完全不同的消息模式的架构方式。它不仅仅是一个现有AJAX技术的替代品,更是一个事件驱动的、被动的方法。
第二,REST是基于HTTP的,是在TCP之上建立的一个应用协议,能够提供给我们用于建立应用逻辑的URLs,HTTP方法,请求或者响应头,状态码,和一些其他的关键件。相比之下,WebSocket是一个TCP之上的一个简单层。它就是一个没有被定义内容的可以被分解成消息的字节流。在不对一个消息内容做出假设的情况下,一个框架能够做的很少。当应用做出那样的假定之后,他们就会围绕这些假定来创建自己的框架。
WebSocket协议定义了的使用(即更高级别的协议)但没有引用它。无论哪种方式,应用都需要决定使用什么消息格式——自定义的、特定框架的或标准的。
总之,一个WebSocket式的应用意味着一个事件驱动型的、响应式的消息传递架构。此外工作在WebSocket层次对于大多数应用程序都比较底层,就像现在的大多数Web应用不直接在套接字上编程。
通向实时网络之路
我们可以从现有的各种框架里看到好多使用高等消息API,也在底层使用WebSocket,并在必要时依赖一些其他的备选项(比如HTTP流,长轮询等)。即便是在今天,也需要依赖于WebSocket和非WebSocket的混合技术。关键区别就在于框架是否提供一个单独的API允许在必要时透明的回退到非WebSocket传输。
一些框架,比如Socket.io和Vert.x提供轻量级的应用组件为事件和消息指定处理者。另一部分,像CometD,通过内部建立一个消息代理来为绑定和接收消息提供通道。像RabbitMQ或者ActiveMQ也提供了直接从浏览器获取消息代理的选项。当遇到通信架构时,消息代理模式适合用于构造规模应用的。
Spring4.0的方法
Spring4.0 ——也就是当前的候选版本,预计GA于2013年12月发布——一个目标就是为Websocket类型的应用提供支持。它不仅在基于JSR-356容器之上提供Websocket API 表现良好,而且也为那些不支持或者不允许使用Websocket的浏览器和网络提供了一些候选项。更重要的是,它为在网络应用中构建Websocket形式的消息架构提供了基础。
我们决定使用SockJS protocol作为候选项。它能为这些候选项,提供着最好和最广泛的传输方式。
对于基于WebSocket模式的消息驱动的架构来说,我们也查看了许多现有的方法,我们喜欢这种真正的消息代理的处理能力,也同样喜欢一个网页应用使用中心处理模块的方式。毕竟,我们必须采用一个消息驱动的架构,但同时我们也是网络开发者,更习惯建立网页应用,所以结果不能和我们已知的相差太大。
第一步就是选择一个消息的格式。有许多简单消息协议诸如STOMP,MQTT和WAMP。这些都适合应用于网页客户端,并为基本的消息模式提供支持。我们选择了STOMP,因为它的消息格式是基于HTTP模块化的,同时它也能被广泛的支持。然而,我们的处理模块并没有过分依赖于STOMP,这个处理模块也能被扩展成支持其他简单协议。
使用STOMP协议能够让我们站在WebSocket的肩膀上。它能够提供一种方法来解析一个消息应该传递给谁,我们又对接收什么样的消息感兴趣。它允许我们像是使用广播消息代理的插件一样使用可用的客户端库文件,比如stomp.js和msg.js。这就是明显的优势。
Spring4提供了STOMP支持。通过两三行的配置,你就可以在网络客户端中把它当做一个轻量级的消息代理。它能够不需要任何服务器代码就自动处理绑定的事件,并允许控制器方法处理进来的消息和绑定事件。这与如何通过Spring MVC映射HTTP请求到控制器方法是相似的。实际上,一个spring MVC控制器能够被扩展成基于WebSocket的接收STOMP消息的形式。
@Controller
public class GreetingController
@RequestMapping(value=”/greeting”, method=POST)
public void httpGreet(String text)
@MessageMapping(&/greeting&)
public void stompGreet(String text)
使用一个全功能的消息代理
在一个全功能的的消息代理中做一个插件也是很容易的。举个例子,RabbitMQ(或者其他STOMP消息代理),能够被用来处理客户端广播消息的绑定。在这个场景中,Spring仍然是处于网络客户端连接和交换数据的网络应用层。同时,它也当做一个网关来为RabbitMQ服务,允许消息从应用流向RabbitMQ,接着转发给绑定此消息的客户端。下面的流程图就是描述这种路径的:
这个路径阐述了运行在多服务器和云环境中的大量应用实例能够通过RabbitMQ服务广播到达所有连接的客户端,而不论此时客户端连接的是哪一个应用实例。此外,也很容易从HTTP请求处理方法广播消息到连接的客户端或者应用的其他部分。
如需更详尽的技术概览说明,请移步spring.io上的M2 blog post,运行股票投资组合样例,或者浏览spring开发频道的在线论坛。我们最近发布了RC1候选版。如果你有一个应用的想法,现在是努力去实现和提供反馈绝佳时机。
如果你恰好在伦敦区域或者很容易到达这里,在11月的14、15日两天,这里有一个spring 交流会。届时会有spring关键工程师代表出席,并会发布最伟大的spring4.0框架和我们支持WebSocket的STOMP协议。
精品视频课程推荐
本视频课程是北京Java私塾原创精品书籍《研磨设计模式》一书的配套学习视频,由《研磨设计模式》的第一作者CC录制
课程目标:全面、系统的掌握GoF设计模式的知识,达到可以在实际项目开发中运用的能力
技术要点:如何实现可配置、如何实现缓存以及缓存的管理、如何实现用缓存来控制多实例的创建、如何实现参数化工厂、 如何实现可扩展工厂、如何实现原型管理器、如何实现Java的静态代理和动态代理、如何实现多线程处理队列请求、 如何实现命令的参数化配置、可撤销的操作、宏命令、队列请求和日志请求、如何实现翻页迭代、如何检测环状结构、 如何实现通用的增删改查、如何模拟工作流来处理流程、如何实现简单又通用的XML读取、如何实现模拟AOP的功能......
本课程专注于数据结构和算法的内容,使用Java来进行代码示例,不空洞的讲解概念和理论,重点放在代码的实现和示例上。
从零开始、全面系统、成体系的讲解数据结构和基本算法,循序渐进的讲述构建软件系统所常见的数据结构和算法。
系统、完整的学习Spring Web MVC开发的知识。包括:Spring Web MVC入门;理解DispatcherServlet;注解式控制器开发详解;数据类型转换;数据格式化;数据验证; 拦截器;对Ajax的支持;文件上传下载;表单标签等内容;最后以一个综合的CRUD带翻页的应用示例来综合所学的知识
系统、完整的学习Spring Data JPA开发的知识。包括:Spring Data JPA入门;JpaRepository基本功能 ;JpaRepository的查询;客户化扩展JpaRepository;Specifications查询。
内容概述:本课程专注于构建:高可扩展性、高性能、大数据量、高并发、分布式的系统架构。
从零开始、全面系统、成体系的软件架构课程,循序渐进的讲述构建上述系统架构所需要的各种技术知识和技能。
技术要点:
1:构建基本的业务功能块,基于Maven+Git+Spring mvc+spring+mybatis+ehcache+mysql+X-gen代码生成
&2:高扩展性的分布式体系架构(基于Nginx+Varnish+Memcache+ActiveMQ)
&3:NoSQL的合理使用和架构优化(基于MongoDB)
&4:分布式文件存储和架构优化(基于MogileFS)
选择一个版面
软件设计专版
Web前端技术
学习问题讨论
面试、就业
版权所有 Copyright(C) 私塾在线学习网Spring websocket在线聊天室 | 天码营 - 新一代技术学习服务平台
Spring websocket在线聊天室
每天大家都在使用QQ等即时聊天工具,今天我们就使用Spring框架以及websocket技术在网页端简单的实现一个在线聊天的功能。添加maven依赖在线聊天室使需要使用到的技术或者框架包括:maven作为构建工具spring-boot作为后端框架spring websocket作为即时消息通讯工具thymeleaf作为模板引擎angular作为前端框架因此,我们首先在pom.xml中添加上述依赖:&dependencies&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-web&/artifactId&
&/dependency&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-thymeleaf&/artifactId&
&/dependency&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-websocket&/artifactId&
&/dependency&
&/dependencies&
添加登录功能我们首先来做一个简单的登录功能,主要目的是维护一个用户列表,这里我们不考虑用户验证或者登出等问题,因此,我们只需要一个登录的地址:@Controller
public class LoginController {
@Autowired private SimpMessagingTemplate messagingT
@Autowired private ParticipantRepository participantR
private static final String LOGIN = "/app/chat.login";
private static final String LOGOUT = "/app/chat.logout";
@RequestMapping(value = "login", method=RequestMethod.POST)
public String login(HttpServletRequest httpRequest, User user) throws ServletException{
user.setTime(new Date());
httpRequest.getSession().setAttribute("user", user);
messagingTemplate.convertAndSend(LOGIN, user);
if(participantRepository.getActiveSessions().
containsKey(httpRequest.getSession().getId())){
messagingTemplate.convertAndSend(LOGOUT,
participantRepository.getActiveSessions().
get(httpRequest.getSession().getId()));
participantRepository.add(httpRequest.getSession().getId(), user);
return "redirect:/chat";
需要注意的是每个登录用户在登录的时候都需要往websocket的/app/chat.login地址发送登录的信息,如果以前登录过,则往发送/app/chat.logout一个登出信息,以便客户端更新用户列表。配置websocket我们通过@EnableWebSocketMessageBroker标注打开websocket服务,并通过继承AbstractWebSocketMessageBrokerConfigurer对websocket进行配置,这里我们进行两个配置:@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
public void configureMessageBroker(MessageBrokerRegistry config)
config.setApplicationDestinationPrefixes("/app");
通过registry.addEndpoint("/ws").withSockJS();使得客户端可以通过/ws地址与后台建立websocket连接。设置config.setApplicationDestinationPrefixes("/app");将/app开头的地址标识为应用地址。此时,用户可以通过/ws地址与服务器建立websocket连接,并通过websocket进行通信。添加聊天后台这里我们为添加两个方法:首先是聊天页面,当用户访问/chat地址时,如果未登录,则抛出AccessDeniedException错误,我们的错误处理会将用户重定向到登录页面,如果用户已登录,则显示聊天页面开始聊天。其次我们通过websocket的/chat.participants频道提供了在线用户列表,当用户订阅/app/chat.participants时,将会获得当前在线用户的列表。@Controller
public class ChatController {
@Autowired ParticipantRepository participantR
@RequestMapping(value="/chat", method=RequestMethod.GET)
public String chatPage(HttpServletRequest request, Model model) throws AccessDeniedException{
if(request.getSession().getAttribute("user") == null){
throw new AccessDeniedException("login please");
User user = (User)request.getSession().getAttribute("user");
model.addAttribute("username", user.getUsername());
return "chat";
@SubscribeMapping("/chat.participants")
public Collection&User& retrieveParticipants() {
return participantRepository.getActiveSessions().values();
添加websocket客户端系统前端主要基于angular来实现,因此我们对基本websocket操作进行了封装,包括连接、订阅、发送消息。如果有兴趣,可以参考/src/main/resources/static/js/services.js。我们的主要逻辑都在/src/main/resources/static/js/controllers.js中,因此我们主要讲解一下这个文件。首先我们来看看initStompClient方法,该方法与服务器建立了websocket连接,同时订阅了我们所需要用到的几个频道:/app/chat.participants 该频道由服务器提供服务,订阅后,服务器会返回当前的用户列表/topic/chat.login 当有用户登录,服务器会往该频道发送一个信息,客户端接收信息后将该用户添加进在线用户列表/app/chat.logout 当有用户登出,服务器会会往该频道发送一个信息,客户端接收信息后将该用户移出在线用户列表/app/chat.typing 当用户在进行输入时,会往该频道广播一个信息,客户端接收消息后在前端显示该用户正在编辑/app/chat.message 用户发送消息时,会往该频道广播一条消息,客户端接收该消息,并展示该消息var initStompClient = function() {
chatSocket.init('/ws');
chatSocket.connect(function(frame) {
chatSocket.subscribe("/app/chat.participants", function(message) {
$scope.participants = JSON.parse(message.body);
chatSocket.subscribe("/app/chat.login", function(message) {
$scope.participants.unshift({
username: JSON.parse(message.body).username,
typing : false});
chatSocket.subscribe("/app/chat.logout", function(message) {
var username = JSON.parse(message.body).
for(var index in $scope.participants) {
if($scope.participants[index].username == username) {
$scope.participants.splice(index, 1);
chatSocket.subscribe("/app/chat.typing", function(message) {
var parsed = JSON.parse(message.body);
if(parsed.username == $scope.username)
for(var index in $scope.participants) {
var participant = $scope.participants[index];
if(participant.username == parsed.username) {
$scope.participants[index].typing = parsed.
chatSocket.subscribe("/app/chat.message", function(message) {
$scope.messages.unshift(JSON.parse(message.body));
}, function(error) {
toaster.pop('error', 'Error', 'Connection error ' + error);
向websocket广播消息广播消息其实很简单,只需要向某个固定频道发送消息,这样所有订阅了该频道的用户都能接收到相应的信息,具体代码如下:$scope.sendMessage = function() {
chatSocket.send(
"/app/chat.message",
JSON.stringify({
message: $scope.newMessage,
username: $scope.username
$scope.newMessage = '';
本文由创作,转载需署名作者且注明文章出处
要获取本文的参考代码,请访问:
&代码不是评论里就有么
&能把你做的例子给我发一份吗 ?我这几天也在做个功能,谢谢了。 QQ邮箱
&在线客服的话可能还涉及到聊天信息持久化的问题 你应该还需要一个数据库存储之前的聊天记录 当客服第一次订阅某个频道的时候 去数据库将相应的信息都取出来 一起返回过去 这个和chat.participants的逻辑是差不多的
&当然可以啊&这篇文章里说到了,我们这里实际上是通过订阅某个webscoket的channel并且往这个channel里发送消息来实现聊天的所以多人聊天的思路也很简单,当一个用户与某个人或者多个人开始聊天的时候,后台生成一个不重复的channel的名称(例如"/app/chat.message-1"),然后前端订阅该channel就可以了
我想问下,你这个聊天的可以同时一对多的聊天,在不同的窗口吗 ?我现在在做一个在线客服系统。用到这块的技术,好多地方不是很明白,请赐教!!!如果可以的话。我在线等。扣扣
&抱歉 之前是网站的一个bug 现在可以了:
您好,参考代码总是获取列表出错,能给我发一下源码吗?非常感谢
源代码的链接在菜单栏里就能看到啊&
:《Spring websocket在线聊天室》有没有源码?能不能给我一份偶,非常感谢
&源代码里有啊,地址是&,这里存储了sessionId对应的user
ParticipantRepository participantRepository // 这个是什么呀?能贴出来么
/cahrt &和 &/chart &都应该是 /chat吧,改一下吧spring+websocket的使用
(window.slotbydup=window.slotbydup || []).push({
id: '2611110',
container: s,
size: '240,200',
display: 'inlay-fix'
您当前位置: &
[ 所属分类
| 时间 2015 |
作者 红领巾 ]
一、spring配置文件
&?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:websocket="http://www.springframework.org/schema/websocket"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/websocket
http://www.springframework.org/schema/websocket/spring-websocket-4.1.xsd "&
&!-- @Autowired等注解驱动 --&
&context:annotation-config /&
&mvc:annotation-driven/&
&!--一定要扫描指定的项目报--&
&context:component-scan base-package="com.soccermaster.websocket"&&/context:component-scan&
&context:component-scan base-package="com.soccermaster.service"&&/context:component-scan&
&context:component-scan base-package="com.soccermaster.dao"&&/context:component-scan&
&bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/&
&bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/pages/" p:suffix=".jsp"&
二、web.xml配置
注意:必须将对应filter和servlet添加
&async-supported&true&/async-supported&
&?xml version="1.0" encoding="UTF-8"?&&web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="/xml/ns/javaee" xsi:schemaLocation="/xml/ns/javaee /xml/ns/javaee/web-app_3_0.xsd" version="3.0"&
&display-name&spring websocket信息推送&/display-name&
&welcome-file-list&
&welcome-file&testSocket.jsp&/welcome-file&
&/welcome-file-list&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
&listener&
&listener-class&org.springframework.web.util.IntrospectorCleanupListener&/listener-class&
&/listener&
&servlet-name&SpringMVC&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&init-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:spring-mvc.xml&/param-value&
&/init-param&
&load-on-startup&1&/load-on-startup&
&async-supported&true&/async-supported&
&/servlet&
&servlet-mapping&
&servlet-name&SpringMVC&/servlet-name&
&url-pattern&/&/url-pattern&
&/servlet-mapping&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&classpath:spring-mybatis.xml&/param-value&
&/context-param&
&filter-name&encodingFilter&/filter-name&
&filter-class&org.springframework.web.filter.CharacterEncodingFilter&/filter-class&
&async-supported&true&/async-supported&
&init-param&
&param-name&encoding&/param-name&
&param-value&UTF-8&/param-value&
&/init-param&
&filter-mapping&
&filter-name&encodingFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&/filter-mapping&
&session-config&
&session-timeout&30&/session-timeout&
&/session-config&&/web-app&
a、websocketconfig
package com.soccermaster.import org.springframework.context.annotation.Cimport org.springframework.web.servlet.config.annotation.EnableWebMimport org.springframework.web.servlet.config.annotation.WebMvcConfigurerAimport org.springframework.web.socket.WebSocketHimport org.springframework.web.socket.config.annotation.EnableWebSimport org.springframework.web.socket.config.annotation.WebSocketCimport org.springframework.web.socket.config.annotation.WebSocketHandlerRimport org.springframework.context.annotation.B@Configuration@EnableWebMvc@EnableWebSocketpublic class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer { public WebSocketConfig() { } @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(systemWebSocketHandler(), "/websck").addInterceptors(new WebSocketHandshakeInterceptor());
System.out.println("registed!");
registry.addHandler(systemWebSocketHandler(), "/sockjs/websck/info").addInterceptors(new WebSocketHandshakeInterceptor()).withSockJS(); } @Bean public WebSocketHandler systemWebSocketHandler() {
//return new InfoSocketEndPoint();
return new SystemWebSocketHandler(); }}
b、WebSocketHandshakeInterceptor
package com.soccermaster.import java.util.Mimport org.springframework.http.server.ServerHttpRimport org.springframework.http.server.ServerHttpRimport org.import org.springframework.web.socket.WebSocketHimport org.springframework.web.socket.server.support.HttpSessionHandshakeI@Componentpublic class WebSocketHandshakeInterceptor extends HttpSessionHandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Map&String, Object& attributes) throws Exception {
System.out.println("Before Handshake");
return super.beforeHandshake(request, response, wsHandler, attributes); } @Override public void afterHandshake(ServerHttpRequest request,
ServerHttpResponse response, WebSocketHandler wsHandler,
Exception ex) {
System.out.println("After Handshake");
super.afterHandshake(request, response, wsHandler, ex); }}
c、SystemWebSocketHandler
package com.soccermaster.import java.io.IOEimport java.util.ArrayLimport org.slf4j.Limport org.slf4j.LoggerFimport org.springframework.beans.factory.annotation.Aimport org.import org.springframework.web.socket.CloseSimport org.springframework.web.socket.TextMimport org.springframework.web.socket.WebSocketHimport org.springframework.web.socket.WebSocketMimport org.springframework.web.socket.WebSocketS&!--如下接口是自己的业务接口 根据情况自定义--&import com.soccermaster.service.IMatchSimport com.soccermaster.util.json.JsonC/** * */@Componentpublic class SystemWebSocketHandler implements WebSocketHandler { @Autowired private IMatchService matchS private static final L private static final ArrayList&WebSocketSession& static {
users = new ArrayList&WebSocketSession&();
logger = LoggerFactory.getLogger(SystemWebSocketHandler.class); } @Override public void afterConnectionEstablished(WebSocketSession session)
throws Exception {
logger.debug("connect to the websocket success......");
System.out.println("connect to the websocket success......");
session.sendMessage(new TextMessage("Server:connected OK!"));
users.add(session); } @Override public void handleMessage(WebSocketSession wss, WebSocketMessage&?& wsm)
throws Exception {
logger.debug("websocket handle message......");
TextMessage returnMessage = new TextMessage(result);
wss.sendMessage("服务端返回信息");
//sendMessageToUsers(wss, wsm); } @Override public void handleTransportError(WebSocketSession wss, Throwable thrwbl)
throws Exception {
if (wss.isOpen()) {
wss.close();
users.remove(wss);
logger.debug("websocket connection closed happen error......");
System.out.println("websocket connection closed happen error......"); } @Override public void afterConnectionClosed(WebSocketSession wss, CloseStatus cs)
throws Exception {
System.out.println("websocket connection closed......");
users.remove(wss);
logger.debug("websocket connection closed......"); } @Override public boolean supportsPartialMessages() {
四、相关项目jar包 /s/1sjI9GOt
如上基本完成 spring websocket
环境要求tomcat7及其以上 + jdk 1.7
转载请注明本文标题:本站链接:
分享请点击:
1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
梦想属于一心实现自己预言的人!
手机客户端
,专注代码审计及安全周边编程,转载请注明出处:http://www.codesec.net
转载文章如有侵权,请邮件 admin[at]codesec.net

我要回帖

更多关于 spring websocket 404 的文章

 

随机推荐