本博文,保证不用装B的话语和太多专业的语言,保证简单易懂,只要懂JAVAEE开发的人都可以看懂。 本博文发表目的是,目前网上针对Websocket的资料太散乱,导致初学者的知识体系零零散散,学习困难加大。本博加以整理,并且实践。
所用核心技术选型:
Tomcat + Spring 4.0.3 + Mongodb(高并发数据库)
+ SpringQueue(消息队列)+ ActiveMQ (消息队列)
+ Spring-data-Mongo + Servlet 3.0
+Spring-Websocket
+ Maven
注:以下Websocket 均省略成 WB
先说Websocket 的原理。 Websocket 是全双工通讯(说白了就是俩都可以通讯,服务器也可以给客户端发消息,客户端也能给服务器发消息)。也是基于TCP的,效率是很高的,首先这个技术的底层选用,就决定了完全可以用wb这个技术做高并发应用,而且开发非常快!!代码非常简单!!最重要的是稳定性,扩展性等等都有保证,等会儿说为什么说都有保证。
WB 不同于TCP的三次握手。 WB是先进行一次HTTP请求,这个请求头不同于普通HTTP请求,等会贴出来讲解。然后服务器开始辨认请求头,如果是WB的请求头,则开始进行普通的TCP连接,即三次握手(不懂的TCP的,出门百度)。如果不是WB的HTTP请求头,那就是按普通的HTTP请求处理。
流程梳理: HTTP特殊请求(有个特殊的头) ---- 》 服务请接收判断 ----- 》 认出来了,确实是WB请求头,开启TCP 三次握手,建立连接后,和TCP一样了就------》没有认出来,不是WB的请求头,按普通HTTP请求处理。
很清楚了吧。这是个基础,先理解了,下面写程序才好搞。下面这段是Webscoket的请求头。 GET请求
GET ws://localhost:12345/websocket/test.html HTTP/1.1
Origin: http://localhost
Connection: Upgrade
Host: localhost:12345
Sec-WebSocket-Key: JspZdPxs9MrWCt3j6h7KdQ== //主要这个字段,这个叫“梦幻字符串”,这个加密规则可以去百度,是有规则的。这个也是个密钥,只有有这个密钥 服务器才能通过解码 认出来,哦~这是个WB的请求,我要建立TCP连接了!!!如果这个字符串没有按照加密规则加密,那服务端就认不出来,就会认为这整个协议就是个HTTP请求。更不会开TCP。其他的字段都可以随便设置,但是这个字段是最重要的字段,标识WB协议的一个字段。
Upgrade: websocket
Sec-WebSocket-Version: 13
下面这段是服务端回应消息:
HTTP/1.1 101 Web Socket Protocol Handshake
WebSocket-Location: ws://localhost:12345/websocket/test.php
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: zUyzbJdkVJjhhu8KiAUCDmHtY/o= //这个字段,叫“梦幻字符串”,和上面那个梦幻字符串作用一样。不同的是,这个字符串是要让客户端辨认的,客户端拿到后自动解码。并且辨认是不是一个WB请求。然后进行相应的操作。这个字段也是重中之重,不可随便修改的。加密规则,依然是有规则的,可以去百度一下。
WebSocket-Origin: http://localhost
好了,一去一回的HTTP请求, 如果他们的梦幻字符串都对上了,客户端服务端都确定是一次WB请求了。。那就开始建立TCP连接了。
关于Tcp编程,为什么没有选用Netty或者Mina框架,而选用以上的技术。 其实我感觉还是他们太复杂。并且,我们用Netty的话,集群规则,负载均衡,JVM优化都需要自己做。集群规则,负载均衡这块儿,就是另一个大的研究方向,一个人根本搞不下来。
不如放在容器里。比如Tomcat,你要真嫌弃Tomcat太低端。换Jboss也不是不行,他们都做了N年的优化和开发,稳定性绝对OK,集群规则,负载均衡,JVM等等都有现成的解决方案,还有其他的一些优化 ,可以说世界顶尖。满足你的高并发一点问题都没。
不要重复造轮子!!别人(JBoss)的集群规则好,负载均衡稳定,就用就是了!!!!所以,小的WB应用推荐tomcat,高并发的WB应用,推荐Jboss。并且合理设置集群规则,合理配置负载均衡,合理优化JVM,我保证,满足你的高并发websocket需求完全不是问题。。
加上我们的数据库选型和消息队列,都是为高并发添火的技术,所以代码写的干净的话,高并发完全不是问题。不用纠结,WB的效率如何,集群怎么做~负载均衡是不是要自己写。。答案是NO。 解决方案是 用高端点的应用容器!!
这就是WB和TCP比的优势!!他可以在容器里搞~ 集群方案,负载均衡方案都是人家做好的。
原生的TCP协议,你必须自己去解决这些问题。这真是一个大问题,想想就知道了,单单集群这块儿,有几个能做的好的。