spring4使用websocket
看到spring4的介绍上说已经支持websocket了,尝试了一下之后各种坑,不如servlet简单,写篇文章来讲解一下自己遇到的坑。
环境:tomcat8+spring4.1.6+jdk8+nginx1.8.0
先是看了下网络上的人的实现,千奇百怪,干脆直接在spring的官方文档上观望了一下,看了下他们官方的实现,然而我用的是springmvc,总是失败,报的错误翻译过来大致是找不到请求,所有的页面请求都找不到,找到原因是WebSocketConfig在继承AbstractWebSocketMessageBrokerConfigurer的时候注解上需要加上对springMVC的支持,即@EnableWebMvc,和你在spring配置文件里配置包扫描一个用处。废话不多说,先上代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.socket.config.annotation.*; @Configuration @EnableWebMvc @EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker( "/tweet" ); config.setApplicationDestinationPrefixes( "/websocket" ); } public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint( "/hello" ).withSockJS(); } } |
以上是websocket配置类,下面是请求。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import com.yuorfei.bean.ResultData; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Controller; @Controller ( "chat" ) public class ChatAction { private static final Log log = LogFactory.getLog(MessageAction. class ); @MessageMapping ( "/hello" ) @SendTo ( "/tweet/fuck" ) public ResultData chat(String message) throws Exception { long time = System.currentTimeMillis(); log.info(time+ ":" +message); return new ResultData(time, true ,message); } } |
请求类准备好了之后写前端代码:
前端代码需要引入的js有sockjs-1.0.3.min.js,stomp.min.js两个,去官网下最新的就行,我目前用的是最新的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
<! DOCTYPE html> < html > < head > < meta charset = "utf-8" > < meta http-equiv = "X-UA-Compatible" content = "IE=edge" > < script src = "/dest/js/fun/chat/sockjs-1.0.3.min.js" ></ script > < script src = "/dest/js/fun/chat/stomp.min.js" ></ script > <!-- 为了方便起见,js我就直接这么放这儿了 --> < script > var stompClient = null; function setConnected(connected) { document.getElementById('connect').disabled = connected; document.getElementById('disconnect').disabled = !connected; document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden'; document.getElementById('response').innerHTML = ''; } function connect() { var socket = new SockJS('/hello'); stompClient = Stomp.over(socket); stompClient.connect({}, function(frame) { setConnected(true); console.log('Connected: ' + frame); stompClient.subscribe('/tweet/fuck', function(greeting){ showGreeting(JSON.parse(greeting.body).code+" : "+ JSON.parse(greeting.body).message); }); }); } function disconnect() { if (stompClient != null) { stompClient.disconnect(); } setConnected(false); console.log("Disconnected"); } function sendMessage() { var message = document.getElementById('message').value; stompClient.send("/websocket/hello", {}, JSON.stringify({ 'message': message })); } function showGreeting(message) { var response = document.getElementById('response'); var p = document.createElement('p'); p.style.wordWrap = 'break-word'; p.appendChild(document.createTextNode(message)); response.appendChild(p); } </ script > </ head > < body onload = "disconnect()" > < noscript > < h2 style = "color: #ff0000" >不支持的浏览器版本,丫的是不是用IE了,你这简直是摧残程序员的生命</ h2 > </ noscript > < a href = "${homeUrl!" /"}">< h5 >返回与或非网站首页</ h5 ></ a > < hr /> < p >这只是一个SpringMVC的websocket例子</ p > < div > < div > < button id = "connect" onclick = "connect();" >连接</ button > < button id = "disconnect" disabled = "disabled" onclick = "disconnect();" > 断开连接</ button > </ div > < div id = "conversationDiv" > < label >你要说什么</ label >< input type = "text" id = "message" /> < button id = "sendMessage" onclick = "sendMessage();" >发送</ button > < p id = "response" ></ p > </ div > </ div > < hr /> </ body > </ html > |
到了这里就ok了,但是运行却发现会报错,错误信息翻译过来大致意思是:没有引入jackson2的包 或者 socket消息转换没有配置。
猛然一想我的确没有引入jackson2,赶紧maven把jackson2的依赖加进来,很久以前用过jackson,然而不知道2里头只引入core的jar包是不行的,还需要
jackson-databind和jackson-annotations,为了方便我索性全加入进来了(真是够大的,不如fastjson清爽)。
这样就ok了,配置好了之后发送消息,正常接收,处理,ok,控制台不报烦人的错了
spring4使用websocket的更多相关文章
- spring4 使用websocket
要了解的内容: sockjs,对于低版本的ie等不支持websocket的浏览器,采用js模拟websocket对象的办法来实现兼容(其实也有轮询的情况).sockjs地址 https://githu ...
- tomcat支持的websocket服务
首发:个人博客 在tomcat7之后的版本,写个websocket服务程序非常容易——如以下代码所示,当客户端建立了一个连接并发送了一些什么内容到服务器,服务器将每隔两秒返回一个字符串“world”. ...
- web即时通讯2--基于Spring websocket达到web聊天室
如本文所用,Spring4和websocket要构建web聊天室,根据框架SpringMVC+Spring+Hibernate的Maven项目,后台使用spring websocket进行消息转发和聊 ...
- spring4+websocket+nginx详细配置
实现的版本jdk1.7.0_25, tomcat7.0.47.0, Tengine/2.1.1 (nginx/1.6.2), servlet3.0, spring4.2.2 使用maven导入版本3. ...
- spring4 security 4 +websocket 实现单点登录
测试地址:http://sms.reyo.cn/ 帐号:aa 密码:123456 先看一下效果图: spring4 security 4 实现单点登录,而websocket 实现单点的下线通知
- spring4.0之九:websocket简单应用
Spring 4.0的一个最大更新是增加了websocket的支持.websocket提供了一个在web应用中的高效.双向的通讯,需要考虑到客户端(浏览器)和服务器之间的高频和低延时消息交换.一般的应 ...
- spring WebSocket详解
场景 websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天.股票交易.游戏 ...
- spring+websocket整合
java-websocket的搭建非常之容易,没用框架的童鞋可以在这里下载撸主亲自调教好的java-websocket程序: Apach Tomcat 8.0.3+MyEclipse+maven+JD ...
- Spring4新特性简述
Spring是一个java世界中极其流行 的开源框架.Spring的初衷是降低企业级开发的复杂性,并试图通过POJO对象实现之前EJB这类重型框架才能实现的功能.Spring不仅仅对服务 端开发有用, ...
随机推荐
- hdu 3718
一个二分图最大匹配的题: 匈牙利算法不熟: 建了个模,用最小费用最大流解决了 #include <iostream> #include <cstring> #define IN ...
- tbr tbn tbc
http://tech.bobgo.net/?m=201004 因为最近的工作需要从MP4视频中提取一些关键帧,要了解如何将视频的时间点转换为对应的帧号,所以查阅了一些关于视频编解码以及时间同步方式的 ...
- Java异常处理之throws抛出异常
package com.test; import java.io.FileReader; public class Test2 { public static void main(String[] a ...
- [CF 191C]Fools and Roads[LCA Tarjan算法][LCA 与 RMQ问题的转化][LCA ST算法]
参考: 1. 郭华阳 - 算法合集之<RMQ与LCA问题>. 讲得很清楚! 2. http://www.cnblogs.com/lazycal/archive/2012/08/11/263 ...
- BZOJ2351: [BeiJing2011]Matrix
2351: [BeiJing2011]Matrix Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 589 Solved: 171[Submit][S ...
- 【随笔】Linux & Shell & Minecraft
官方的服务器依然会报 异常.[搁置] 准备再搭一次minecraft server,从官方的开始,毕竟是最简单的,只要有运行权限就够了. # 2015年12月16日 20:30:50 在阿里云租的虚拟 ...
- jquery插件colortip(tooltip类型)
效果预览:http://demo.tutorialzine.com/2010/07/colortips-jquery-tooltip-plugin/colortips.html 源代码下载:http: ...
- htmlparser 精确提取的一些代码
一. ConnectionManager manager = Page.getConnectionManager(); Parser parser = new Parser(manager .open ...
- OpenLayers 项目完整分析——(二)源代码总体结构分析
转自:http://www.cnblogs.com/lzlynn/archive/2008/07/29/1255848.html 二)源代码总体结构分析 通过前面的项目介绍,我们大概已经知道Openl ...
- 谈谈分布式事务之一:SOA需要怎样的事务控制方式
在一个基于SOA架构的分布式系统体系中,服务(Service)成为了基本的功能提供单元,无论与业务流程无关的基础功能,还是具体的业务逻辑, 均实现在相应的服务之中.服务对外提供统一的接口,服务之间采用 ...