找一个websocket和springmvc结合的例子。网上找的不靠谱。

最近因为需要,不得不玩一个网页游戏。需要在某个时间实时刷新页面。目前做网站的普遍思路是js民调。因为是创新的小项目,所以同组的朋友提出了html5中提到的WebSocket,先进行了技术研究。目前java支持的WebSocket并不多。网上关于websocket实现框架的资料很少。我没见过java EE7加了WebSocket。所以所有的包都来自于tomcat的支持。至少需要三个包,tomcat-coyote,tomcat-catalina和tomcat-annotations-api,因为tomcat从7.027版本开始就支持websocket,7.027版本之前一直使用websocket,但是会出现各种问题。例如,websocket在连接几秒钟后就断开了。所以更好的选择是使用7.027以上的版本。这三个jar包都在对应的tomcat的lib文件夹中。自从我在研究生期间接触到maven之后,我逐渐了解到了maven的强大,在这里不得不感叹。因为是小型敏捷团队,所以版本控制是必须的。我还是想通过maven来控制jar包。所以我直接去了maven中央图书馆搜索了一下。真的有。经过小组讨论,我们决定使用tomcat7.039(好像40已经发布了),解决了版本控制和jar包配置的问题。Pom关于tomcat3的三个jar包如下:

1 & lt;依赖性& gt2 & ltgroupId & gtorg . Apache . Tomcat & lt;/groupId & gt;3 & ltartifactId & gt雄猫-郊狼& lt/artifact id & gt;4 & lt版本& gt7.0.39</version & gt;5 & lt/dependency & gt;6 & lt依赖性& gt7 & ltgroupId & gtorg . Apache . Tomcat & lt;/groupId & gt;8 & ltartifactId & gtTomcat-catalina & lt;/artifact id & gt;9 & lt版本& gt7.0.39</version & gt;10 & lt;/dependency & gt;11 & lt;依赖性& gt12 & lt;groupId & gtorg . Apache . Tomcat & lt;/groupId & gt;13 & lt;artifactId & gtTomcat-注解-API & lt;/artifact id & gt;14 & lt;版本& gt7.0.39</version & gt;15 & lt;/dependency & gt;

下一步是解决架构问题。目前网上找到的关于websocket的实践很少,基本都是websocket架构和非常简单的例子(tomcat自带websocket例子)。websocket机制怎么用?首先基本框架是打算用hibernate+spring mvc结合websocket,但是实际实验中spring mvc和websocket会有一些冲突。因为直到前段时间,Spring Framework 4.0发布的版本才支持JDK 8和WebSocket编程。所以现阶段我们需要其他方式来实现spring mvc+websocket。简单的解决方案是编写一个工具类来手动获取bean。解决spring和websocket支持后需要解决的websocket交互方式。websocket最直接的两种方法是onTextMessage和onBinaryMessage,分别是字节流传输和字符流传输。最好的办法是设计一套自己的传输协议。字节流传输。前台和后台分别解析协议,获得交互操作。其次,可以在onTextMessage,也就是字符流上做文章。json的引入可以得到很好的支持。

要配置websocket:

1实现继承ContextLoaderListener的类,并在web.xml中配置

1导入javax . servlet . servlet context;2导入javax . servlet . servletcontextevent;3 4导入org . spring framework . context . application context;5导入org . spring framework . web . context . context loader listener;6导入org . spring framework . web . context . support . webapplicationcontextutils;7 8公共类SpringLoaderListener扩展ContextLoaderListener { 9 10 @ override 11公共void context initialized(Se rvletContextEvent事件){ 12 super . context initialized(event);13 servlet context context = event . getservlet context();14 application context CTX = webapplicationcontextutils . getrequiredwebapplicationcontext(context);15 springcontextutil . set context(CTX);16 17 }18 19 }

web.xml

1 & lt;听众& gt2 & lt侦听器类& gt3 XXXXXX . utils . spring loader listener 4 & lt;/listener-class & gt;5 & lt/listener & gt;

获取spring bean工具类:

1导入org . spring framework . beans . beans exception;2导入org . spring framework . beans . factory . nosuchbean definitionexception;3导入org . spring framework . context . application context;4 5公共类SpringContextUtil { 6私有静态ApplicationContext上下文;7 8公共静态application context get context(){ 9返回上下文;10 } 11 12公共静态void set context(application context context){ 13 spring context util . context = context;14 }15 16公共静态对象getBean(String name)抛出BeansException{17返回context . get bean(name);18 } 19 20 @ suppress warnings(" unchecked ")21公共静态对象getBean(String name,Class requiredType)抛出beans exception { 22 return context . get bean(name,required type);23 } 24 25 public static boolean contains bean(字符串名称){ 26 return context.containsBean(名称);27 } 28 29 public static boolean is singleton(String name)抛出nosuchbeandidefinitionexception { 30 return context . is singleton(name);31 } 32 33 @ suppress warnings(" unchecked ")34公共静态类getType(String name)抛出nosuchbeandidefinitionexception { 35 return context . getType(name);36 } 37 38 public static String[]getaliasses(String name)抛出nosuchbeandetificationexception { 39 return context . getaliasses(name);40 } 41 42 43 }

介绍json需要的jar包:

1 & lt;依赖性& gt2 & ltgroupId & gtcom . Google . code . gson & lt;/groupId & gt;3 & ltartifactId & gtgson & lt/artifact id & gt;4 & lt版本& gt2 . 2 . 3 & lt;/version & gt;5 & lt/dependency & gt;6 & lt依赖性& gt7 & ltgroupId & gtnet . SF . JSON-lib & lt;/groupId & gt;8 & ltartifactId & gtJSON-lib & lt;/artifact id & gt;9 & lt版本& gt2.4 & lt/version & gt;10 & lt;/dependency & gt;11 & lt;依赖性& gt12 & lt;groupId & gtnet . SF . ez morph & lt;/groupId & gt;13 & lt;artifactId & gtezmorph & lt/artifact id & gt;14 & lt;版本& gt1 . 0 . 6 & lt;/version & gt;15 & lt;/dependency & gt;

后台需要添加两个文件,一个继承WebSocketServlet:

1导入javax . servlet . annotation . web servlet;2导入javax . servlet . mand dispatcher;5 6 public roomsessageinbound(){ 7 if(command dispatcher = = null){ 8 command dispatcher =(CommandDispatcherUtils)spring context util . get bean(" command dispatcher ");9 room = roomlistmodel . getinstance()。getRoom(0);10 } 11 } 12 13 14 @ override 15 protected void on open(ws outbound outbound)16 room . adduser(outbound . hashcode());17 super.onOpen(出站);18 } 19 20 @ override 21 protected void on close(int status){ 22 room . remove(getWsOutbound()。hashCode());23 super.onClose(状态);24 }25 26 @Override27受保护的void on binary message(byte buffer buffer)抛出io exception { 28 29 } 30 31 @ override 32受保护的void on text message(char buffer buffer)抛出io exception { 33 String msg = buffer . tostring();34 JSON object report = JSON object . from object(msg);35 template command command = command dispatcher . getcommandbykey(report . getstring(" command "));36 command.execute(消息、用户、房间);37 }38 39 }

可以通过json Object Report = JSON Object将字符串转换成JSON对象。来自对象(消息)。相当于通过websocket实现了实时对象信息的传输。

在首页,你只需要在页面加载的时候把它添加到js就可以了。

1 $(function(){ 2 room socket = new web socket(' ws://127 . 0 . 0 . 1:8080/XXXX/房间);3 }

前端发送到后台时,数据json.stringify(data)可以是json。

上面的代码被删除了很多。所以代码不需要复制就能工作。只是提供一个解决方案。而且新版java或者Spring Framework 4.0会很容易支持websocket的实现。主要是总结我这段时间的websocket研究。随着各种新技术的诞生,实时web技术变得越来越成熟。Websocket是html5的一个重要特性,值得一看,值得研究。