关于 Websockets
一些参考内容:
用户的需求通常是: 希望web页面更具交互性. 而解决方案就是使用javascript. 而这一切的推动力又是Ajax.
Ajax是异步javascript和xml的缩写(Asynchronous Javascript and XML), 利用这种技术, 可以让远程服务器和客户端保持数据同步. 但在这个机制中XML并非必须的, 它只是作为数据传递的载体, 实际很多时候是使用JSON来进行传递(很多时候又叫AJAJ).
使用Ajax的最大好处是: 客户端不必刷新整个页面就可以实现同服务器的数据交换, 而这种交换对于用户来说可以是透明的.
但这样也造成一个难题: 由于客户端是主动从服务器获取新数据, 但客户端怎么获知数据的更新呢?
过去14年间(2000年开始算起), 针对上面的问题, 出现了各种各样的解决方案.
主要有四种形式的解决办法:
1999年的时候, 在HTTP1.1规范内就提供了一种功能, 可以用在任何HTTP数据交流过程中的功能, 叫做HTTP Upgrade.
作用原理如下:
HTTP Upgrade最好的地方是: 指定的协议几乎可以是任意的. 当HTTP握手结束后就会释放掉之前的HTTP连接. 理论上讲, 使用HTTP Upgrade, 可以建立起任意的两端点间的任意TCP Socket连接(甚至可以是持久的, 全双工的TCP socket连接), 并且连接上工作的协议可以是你自己设计的.
当然, 浏览器不可能将客户端程序员推入到TCP协议栈的深渊让他们自己针对HTTP Upgrade开发自己的协议. 所以由专门机构开发了一些协议出来, 而WebSockets协议正是其中之一.
WebSocket连接的建立过程:
使用WebSocket协议的好处很多, 主要和它的实现有关:
虽然原理很复杂, 但是已经有现成的API了, 要做的就是在上面构建你自己的应用即可...
而WebSocket的API又分为客户端API和服务端API. 不同点只是对不同工作内容的支持不同而已.
用途基本上没有任何限制, 比如浏览器应用, 以及任何支持平台上的客户端应用.下面是一些典型用途:
和HTTP协议一样, 由于是信息交流的规范或标准. 所以使用WebSocket建立的不同应用理论上说都可以相互通信, 不管是哪个平台, 什么类型的.
正是因为如此, 所以大多数WebSocket的实现中都将自己分为客户端和服务器端工具两个部分. 比如Java或.net.
而Javascript中只是有客户端工具的部分, 因为它本身就是用作客户端脚本的.
下面先来使用JavaScript的客户端工具建立客户端, 然后再转到Java的服务端(当然Java也有客户端的API,只是使用Java实现客户端还是交给android中去吧...)
W3C规定将浏览器中的WebSocket支持接口作为HTML5的扩展. 故虽然使用的是Javascript来实现WebSocket的交流, 但实际上WebSocket接口是HTML5的组成部分.任何浏览器都可以通过WebSocket接口的implementation来实现WebSocket通信.(早期的Ajax通信则是不同浏览器有不同的类和不同的方法来做Ajax请求, 比起现在可以说复杂很多)
下面就来建立客户端.
WebSocket API是从Java EE7开始加入进来的, 在规范JSR 356可以查到.
它里面包含了客户端以及服务端的API.
客户端API是基础API: 包含了一个WebSocket端所必须的基本类和接口(在javax.websocket包中).
服务端API: 建立在客户端API之上并对客户端API进行了扩展(javax.websocket.server包中).
所以针对Java的WebSocket API, 有两大部分组件: 仅用于客户端的API或完整版API(服务端API).
API的详细使用需要查看Java EE7的API文档.
下面分别来看看这两个部分的API.
关于Tomcat中WebSocket连接数的限制, 实际就是TCP连接的最大数目:
TO reach the max alive websocket connection in Tomcat, following config changes need to be done.
Change this to from 50 till 65535.
The above configuration changes allows around ~50k live connections in a 2GB Intel Core i5 machine provided the server and client are running in different machines.
下面是一些连接数限制的尝试:
https://blog.krecan.net/2010/05/02/cool-tomcat-is-able-to-handle-more-than-13000-concurrent-connections/
http://grokbase.com/t/tomcat/users/132d14c1q0/achieve-large-number-of-concurrent-websocket-connections-40000-50000
https://github.com/rstoyanchev/spring-websocket-portfolio/issues/52
https://support.appharbor.com/discussions/problems/26648-websockets-max-concurrent-connections-request-queue-limit
https://mrotaru.wordpress.com/2013/10/10/scaling-to-12-million-concurrent-connections-how-migratorydata-did-it/ 经典做法