websocket 俩年前被纳入WebSocket RFC 6455协议中,它定义一种能力,就是在web应用能实现全双工通信,则web客户端能向服务器请求数据,服务器也能简单的向客户端推送数据,WebSocket未出现之前,我们是利用长轮询,客户端和服务器建立起长期的链接,每隔几秒就向服务器请求一次数据,而之前实现这种全双工的技术就有 Java Applets, XMLHttpRequest, Adobe Flash, ActiveXObject, 还有其他的如 Comet 技术等等
浏览器兼容性
在浏览器客户端,html5 websocket的出现,使浏览器客户端能够利用websocket和服务端进行全双工的通讯,但html5 websocket兼容性还不是很好,特别是在IE10以下。为了处理不同浏览器和浏览器版本的兼容性,spring webscoket基于SockJS protocol提供了一种解决兼容性的方法,在底层屏蔽兼容性的问题,提供统一的,透明的,可理解性的webscoket解决方案。
webscoket和传统http协议的区别
传统的http请求的的rest风格现在很流行,它的作用就是通过rest风格,能够把不同路径的请求映射到同一个方法进行处理。http协议可以多次请求,因为每次请求之后,都会关闭链接,下次重新请求数据,需要再次打开链接。而对于webscoket来说,它是一种长链接,只能通过一次请求来初始化链接,然后所有的请求和响应都是通过这个TCP链接进行通讯,这意味着它是一种基于事件驱动,异步的消息机制,和JMS, AMQP等消息机制的应用差不多。
基于websocket的这个特点,spring websocket提供了spring-messaging模块,在spring继承了Message, MessageChannel, MessageHandler等在服务器中,能处理这种消息机制的功能,spring websocket还提供了基于注解的消息处理支持。
WebSocket的子协议
http协议是一种应用层协议,已经定义了请求的格式,例如请求的头部的关键字,还有也定义了,服务器响应数据的格式,它对请求和响应的数据格式做了规范,而websocket协议不同,websocket协议还不够详细,它没有规定请求和接收的数据格式,例如,浏览器想向服务器请求进行socket通讯,但服务器不知道是否要进行socketon通讯,由于这个原因,websocket就定义了一个子协议,也就是浏览器客户端和服务器在请求握手的时候,他们能根据头部的Sec-WebSocket-Protocol,决定是否要进行websocket通讯。当然子协议的使用不是必须的,但是如果不使用子协议,那就必须自己定义一种请求和接收的数据格式规范,然后客户端和服务器都使用这种规范来进行通讯。
spring websocket在服务器和客户端使用了STOMP 这钟消息协议,STOMP 是一种简单的消息协议,在浏览器客户端使用stomp.js进行socket通讯
spring webscoket 支持了STOMP ,通过简单的配置,就能让你的controller通过注解的方式接收基于STOMP的数据格式,让你的controller既能接收http协议的请求也能接收websocket的请求。
备注一下,如果哪为同学想更进一步了解websocket,参考下下面的链接
http://blog.csdn.net/yingxiake/article/details/50906944
http://www.zhihu.com/question/20215561