spring 4.0的一个最大更新是增加了websocket的支持。websocket提供了一个在web应用中的高效、双向的通讯,需要考虑到客户端(浏览器)和服务器之间的高频和低延时消息交换。一般的应用场景有:在线交易、游戏、协作、数据可视化等。
使用websocket需要考虑的浏览器的支持(ie<10不支持),目前主流的浏览器都能很好的支持websocket。
websocket协议中有一些子协议,可以从更高的层次实现编程模型,就像我们使用http而不是tcp一样。这些子协议有stomp,wamp等。
本教程只考虑websocket的简单实用,包含spring对jsr-356的支持及spring websocket api。
spring4.0系列9-欧洲杯足彩官网
java api for websocket已经是java ee 7的一部分。它定义了两类endpoit(都是endpoint类的子类),使用注解标识@clientendpoint和@serverendpoint。
1.1 servlet容器扫描初始化
通过spring初始化一个endpoint,只需配置一个springconfigurator在类上的@serverendpoint注解上。
import javax.websocket.server.serverendpoint; import org.springframework.web.socket.server.endpoint.springconfigurator; @serverendpoint(value = "/echo", configurator = springconfigurator.class); public class echoendpoint { private final echoservice echoservice; @autowired public echoendpoint(echoservice echoservice) { this.echoservice = echoservice; } @onmessage public void handlemessage(session session, string message) { // ... } }
上例假设springcontextloaderlistener用来加载配置,这是个典型的web应用。servlet容器将通过扫描@serverendpoint和springconfigurator初始化一个新的websocket会话。
1.2 spring 初始化
如果你想使用一个单独的实例而不使用servlet容器扫描,将echoendpoint类声明称一个bean,并增加一个serverendpointexporter的bean:
import org.springframework.web.socket.server.endpoint.serverendpointexporter; @configuration public class endpointconfig { @bean public echoendpoint echoendpoint() { return new echoendpoint(echoservice()); } @bean public echoservice echoservice() { // ... } @bean public serverendpointexporter endpointexporter() { return new serverendpointexporter(); } }
echoendpoint 可以通过endpointregistration发布:
import org.springframework.web.socket.server.endpoint.serverendpointexporter; import org.springframework.web.socket.server.endpoint.serverendpointregistration; @configuration public class endpointconfig { @bean public endpointregistration echoendpoint() { return new endpointregistration("/echo", echoendpoint.class); } @bean public serverendpointexporter endpointexporter() { return new serverendpointexporter(); } // .. }
本例源码:
spring websocket api提供了sockjs的支持,且有些容器如jetty 9目前还没有对jsr-356的支持,所以有spring websocket api是必要的。
spring websocket api的核心接口是websockethandler。下面是一个处理文本消息的handler的实现:
import org.springframework.web.socket.adapter.textwebsockethandleradapter; public class echohandler extends textwebsockethandleradapter { @override public void handletextmessage(websocketsession session, textmessage message) throws exception { session.sendmessage(message); } }
websockethandler可以通过websockethttprequesthandler插入到spring mvc里:
import org.springframework.web.socket.server.support.websockethttprequesthandler; @configuration public class webconfig { @bean public simpleurlhandlermapping handlermapping() { mapurlmap = new hashmap (); urlmap.put("/echo", new websockethttprequesthandler(new echohandler())); simpleurlhandlermapping hm = new simpleurlhandlermapping(); hm.seturlmap(urlmap); return hm; } }
sockjs服务器端的支持
sockjs是一个脚本框架,它提供类似于websocket的编程模式但是可以适应不同的浏览器(包括不支持websocket的浏览器)。
开启sockjs的支持,声明一个sockjsservice,和一个url映射,然后提供一个websockethandler来处理消息。虽然我们是哟个sockjs我们开发的方式是一样的,但是随着浏览器的不同传输的协议可以是http streaming,long polling等。
import org.springframework.web.socket.sockjs.sockjsservice; // ... @configuration public class webconfig { @bean public simpleurlhandlermapping handlermapping() { sockjsservice sockjsservice = new defaultsockjsservice(taskscheduler()); mapurlmap = new hashmap (); urlmap.put("/echo/**", new sockjshttprequesthandler(sockjsservice, new echohandler())); simpleurlhandlermapping hm = new simpleurlhandlermapping(); hm.seturlmap(urlmap); return hm; } @bean public threadpooltaskscheduler taskscheduler() { threadpooltaskscheduler taskscheduler = new threadpooltaskscheduler(); taskscheduler.setthreadnameprefix("sockjs-"); return taskscheduler; } }
在我们实际使用中我们会使用websocketconfigurer集中注册websocket服务:
@configuration @enablewebmvc @enablewebsocket//开启websocket public class webconfig extends webmvcconfigureradapter implements websocketconfigurer { @override public void registerwebsockethandlers(websockethandlerregistry registry) { registry.addhandler(echowebsockethandler(), "/echo"); //提供符合w3c标准的websocket数据 registry.addhandler(snakewebsockethandler(), "/snake"); registry.addhandler(echowebsockethandler(), "/sockjs/echo").withsockjs();//提供符合sockjs的数据 registry.addhandler(snakewebsockethandler(), "/sockjs/snake").withsockjs(); } @bean public websockethandler echowebsockethandler() { return new echowebsockethandler(echoservice()); } @bean public websockethandler snakewebsockethandler() { return new perconnectionwebsockethandler(snakewebsockethandler.class); } @bean public defaultechoservice echoservice() { return new defaultechoservice("did you say \"%s\"?"); } // allow serving html files through the default servlet @override public void configuredefaultservlethandling(defaultservlethandlerconfigurer configurer) { configurer.enable(); } }
sockjs客户端代码:
ws = new sockjs(url, undefined, {protocols_whitelist: transports}) ; //初始化 websocket ws.onopen = function () { setconnected(true); log('info: connection opened.'); }; ws.onmessage = function (event) { log('received: ' event.data); //处理服务端返回消息 }; ws.onclose = function (event) { setconnected(false); log('info: connection closed.'); log(event); }; ws.send(message);//向服务端发送消息
程序用maven打成war后用tomcat 8发布查看效果。
本例源码:
新书推荐《javaee开发的颠覆者: spring boot实战》,涵盖spring 4.x、spring mvc 4.x、spring boot企业开发实战。
京东地址:
当当地址:
亚马逊地址:
淘宝地址:
或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。
相关推荐
该插件旨在使spring 4.0中引入的websocket支持可用于grails应用程序。 您也可以使用相应的spring docs / apis / samples作为参考。 在本自述文件中多次提到了这一点,因为其中详细解释了所有内容。 grails版本...
spring 4.0的一个最大更新是增加了websocket的支持。websocket提供了一个在web应用中的高效、双向的通讯,需要考虑到客户端(浏览器)和服务器之间的高频和低延时消息交换。一般的应用场景有:在线交易、游戏、协作...
spring websocket 示例 描述 这是一个使用 spring websocket 4.0.0 release 的 websocket 服务器的小...安装应用程序的最简单方法是将打包的 war 文件复制到 websocket compliant server,例如 jetty 或 tomcat。 享受
概述演示 spring framework 4.0 中的 spring websocket 和 sockjs 支持。 重要提示: master分支包含使用 spring 的websockethandler示例,包括 sockjs 回退选项。 endpoint分支包含使用 jsr-356 endpoint和@...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,*低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
===本人看过,绝不忽悠,放心下载===spring 4.0是spring在积蓄4年后,隆重推出的一个重大升级版本,进一步加强了spring作为java领域*开源平台的翘楚地位。spring 4.0引入了众多java开发者翘首以盼的基于groovy bean...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,*低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,最低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,*低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,最低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,最低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,最低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,最低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,最低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,*低要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用...
spring 4.x企业应用开发实战 pring 4.0是spring在积蓄4年后,隆重推出的一个重大升级版本,进一步加强了spring作为java领域*开源平台的翘楚地位。spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、...
spring 4.0引入了众多java开发者翘首以盼的基于groovy bean的配置、html 5/websocket支持等新功能,全面支持java 8.0,*要求是java 6.0。这些新功能实用性强、易用性高,可大幅降低java应用,特别是java web应用开发...