使用websocket需要考虑的浏览器的支持(ie<10不支持),目前主流的浏览器都能很好的支持websocket。
websocket协议中有一些子协议,可以从更高的层次实现编程模型,就像我们使用http而不是tcp一样。这些子协议有stomp,wamp等。
本教程只考虑websocket的简单实用,包含spring对jsr-356的支持及spring websocket api。
通过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会话。
如果你想使用一个单独的实例而不使用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());
public echoservice echoservice() {
public serverendpointexporter endpointexporter() {
return new serverendpointexporter();
echoendpoint 可以通过endpointregistration发布:

import org.springframework.web.socket.server.endpoint.serverendpointregistration;
public endpointregistration echoendpoint() {
return new endpointregistration("/echo", echoendpoint.class);
// ..
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;
public class webconfig {
public simpleurlhandlermapping handlermapping() {
map<string, object> urlmap = new hashmap<string, object>();
urlmap.put("/echo", new websockethttprequesthandler(new echohandler()));
simpleurlhandlermapping hm = new simpleurlhandlermapping();
hm.seturlmap(urlmap);
return hm;
sockjs是一个脚本框架,它提供类似于websocket的编程模式但是可以适应不同的浏览器(包括不支持websocket的浏览器)。
开启sockjs的支持,声明一个sockjsservice,和一个url映射,然后提供一个websockethandler来处理消息。虽然我们是哟个sockjs我们开发的方式是一样的,但是随着浏览器的不同传输的协议可以是http streaming,long polling等。

import org.springframework.web.socket.sockjs.sockjsservice;
// ...
sockjsservice sockjsservice = new defaultsockjsservice(taskscheduler());
urlmap.put("/echo/**", new sockjshttprequesthandler(sockjsservice, new echohandler()));
public threadpooltaskscheduler taskscheduler() {
threadpooltaskscheduler taskscheduler = new threadpooltaskscheduler();
taskscheduler.setthreadnameprefix("sockjs-");
return taskscheduler;
在我们实际使用中我们会使用websocketconfigurer集中注册websocket服务:

@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());
public websockethandler snakewebsockethandler() {
return new perconnectionwebsockethandler(snakewebsockethandler.class);
public defaultechoservice echoservice() {
return new defaultechoservice("did you say \"%s\"?");
// allow serving html files through the default servlet
public void configuredefaultservlethandling(defaultservlethandlerconfigurer configurer) {
configurer.enable();

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);//向服务端发送消息