WebSocket很多网站都是采用轮询的方式来实现推送技术。轮询是在特定的时间间隔(比如每隔一秒),浏览器向服务器发送一个HTTP请求,然后服务器将最新的数据返回给客户端的浏览器。这种传统模式带来了明显的弊端,即浏览器需要不断地向服务器发送请求。但是HTTP请求可能包含很长的header,真正有效的数据可能只是一小部分。显然,这会消耗大量的带宽资源。在这种情况下,HTML5定义了WebSocket协议,可以更好的节省服务器资源和带宽,实现更实时的通信。WebSocket简介WebSocket是一种不同于HTTP的协议。两者都处于OSI模型的应用层。尽管它们不同,但RFC6455声明:“WebSocket旨在通过端口80和443工作,并支持HTTP代理和中介”,从而使其与HTTP协议兼容。为了兼容性,WebSocket握手从HTTP协议更改为使用HTTPUpgrade标头的WebSocket协议。WebSocket的优点1.实时性强,全双工。2、对HTTP协议有很好的兼容性。默认端口也是80和443,握手阶段使用HTTP协议,握手时不易屏蔽,可以通过各种HTTP代理服务器。3、数据格式比较轻,性能开销小,通信效率高。4.您可以发送文本或二进制数据。5.保留连接状态,省略部分状态信息。协议标识为ws(加密的话就是wss,对应HTTPS协议),服务器URL为URL。ws://example.com:80/some/pathWebSocket握手客户端连接:UpgradeUpgrade:websocketHost:192.168.1.45:3000Origin:http://localhost:8080Sec-WebSocket-Key:w3XxUf6WUX94dfEesLmkOA==Sec-WebSocket-Version:13ServerConnection:UpgradeUpgrade:websocketSec-WebSocket-Accept:fFBooB7FAkLlXgRSz0BT3v4hq5s=Sec-WebSocket-Origin:nullSec-WebSocket-Location:ws://192.168.1.45:3000WebSocketAPI连接建立和断开收发数据处理错误varws=newWebSocket("ws://192.168.1.45:3000/echo");ws.onopen=function(evt){console.log("连接打开...");ws.send("HelloWebSockets!");};ws.onmessage=function(evt){console.log("ReceivedMessage:"+evt.data);ws.close();};ws.onclose=function(evt){console.log("连接关闭。");};WebSocket服务器实现php-http://code.google.com/p/phpwebsocket/jetty-http://jetty.codehaus.org/jetty/(版本7支持websocket)netty-http://www.jboss.org/nettyruby-http://github.com/gimite/web-socket-rubyKaazing-https://web.archive.org/web/20100923224709/http://www.kaazing.org/confluence/display/KAAZING/HomeTomcat-http://tomcat.apache.org/(7.0.27支持websocket,推荐使用tomcat8,7.0.27中的界面已经过时)WebLogic-http://www.oracle.com/us/products/middleware/cloud-app-foundation/weblogic/overview/index.html(12.1.2开始支持)node.js-https://github.com/Worlize/WebSocket-Node(用于演示)node.js-http://socket.ionginx-http://nginx.com/mojolicious-http://mojolicio.us/python-https://github.com/abourget/gevent-socketioDjango-https://github.com/stephenmcd/django-socketioerlang-https://github.com/ninenines/cowboy.gitWebSocket线上体验地址前后端代码
