`
java-mans
  • 浏览: 11416558 次
文章分类
社区版块
存档分类
最新评论

WebSocket和node.js

 
阅读更多

web技术这些日子的发展可谓是有变革性的发展,已不仅局限于web2.0的ajax异步刷新的层面了。个人认为HTML5后真正能够带来变革性意义的技术主要在于WebGL、本地操作的支持,然而web发展不仅仅存在与客户端,服务端技术也发生着变革,Websocket和node.js就是其中的代表,web服务的实时性和异步性带了的革命不亚于客户端的革命。

一般的web模型都是基于get和post的,所有的动作的发起点只有web页面。

如果需要服务器主动推送数据给客户端怎么办呢?有两种方法一种是客户端轮询,另一种是长连接。

客户端轮询在ajax普遍使用之前都是频刷页面来实现,性能和用户体验自然差很多,好在ajax出现后js异步响应,但是客户端需要有专门的定时事件去抓取服务端数据,性能也不会很好。长连接方式需要服务端和客户端的协作了,客户端发起长连接,服务端也不能断开,保持一条通讯通道,但是由于这条通道的存在,请求也就不可能结束,页面一直处于请求状态而不能结束,所以为了不影响主页面的加载过程一般会添加一个隐藏的frame来保持连接,但是会受到跨域的限制。这却不能从根本上解决问题,websocket的技术应运而生,当然首先需要浏览器的支持。websocket是客户端和服务端异步通信的技术。他是建立在http协议之上的,在客户端编程你不需要做任何过多的操作只需要使用WebSocket对象就可以了。他包括三种事件:打开连接、消息到达、关闭连接,和一个动作:发送数据。如下:

var socket = new WebSocket("ws://localhost:80")//注意:websocket使用的是ws而不是http
socket.onopen(event)
socket.send()
socket.onmessage()
socket.onclose()

客户端编程很容易。服务端呢?

由于websocket协议规定了他需要有一个握手过程:

客户端:
GET /call HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: localhost:8080
Origin: http://localhost
Cookie: somenterCookie
服务端:
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://localhost
WebSocket-Location: ws://localhost:8080/call
通讯数以”\x00″开头以”\xFF”结尾。具体数据收发过程和一般的通讯过程没什么两样了。

这些标准使得我们在服务端需要去重新做一些工作。已经有很多人实现了这些,并提供出来供大家使用。

为什么要提到node.js呢?node.js是一个服务端javascript解释器,除了语言上简单很容易实现事件事件驱动外,他真实的优势在于很容易去实现异步。他运行在一个V8引擎基础上,理论上这个模型可以用任意语言来实现,并且已经有人在C++和C#上实现了。

下面是一个node.js的helloworld:

var sys = require("sys"),
    http = require("http");
http.createServer(function(request, response) {
    response.sendHeader(200, {"Content-Type": "text/html"});
    response.write("Hello World!");
    response.close();
}).listen(8080);
sys.puts("running...");
web的发展形势还是大好的。






  


  
分享到:
评论
1 楼 wahahachuang8 2018-02-28  
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方便,GoEasy就挺不错的,我昨天试了一下,代码简洁易懂,几分钟我就洗了一个自己的实时推送功能;官网: http://goeasy.io/

相关推荐

Global site tag (gtag.js) - Google Analytics