转自:http://cnodejs.org/blog/?p=273
本文为原创文章,出自http://cnodejs.org,转载请注明出处和作者
作者:kennyz
原文:http://cnodejs.org/blog/?p=273
之所以写下此文,是我觉得越是简单的技术往往能发挥越重要的作用,随着各种新的技术的诞生,实时web技术已经走进我们。websocket和node.js使开发实时应用非常简单,同时性能也非常高。
关于websocket
websocket是html5的重要feature,它直接在浏览器上对与socket的支持,这给了web开发无限的想象,虽然以前也有flash socket+js的实现,不过毕竟不稳定,而且兼容性有很多问题,当然websocket的普及也依赖于支持html5标准的浏览器的更新,目前只有chrome、safari、firefox 4.0等少数浏览器可以支持,不过大势所驱,加上智能移动设备的普及,websocket可以有更大的作为。
他解决了web实时化的问题,相比传统http有如下好处:
一个WEB客户端只建立一个TCP连接
Websocket服务端可以推送(push)数据到web客户端.
有更加轻量级的头,减少数据传送量
本文来重点来分析下。
websocket的原理和应用
在继续本文之前,让我们了解下websocket的原理:
websocket通信协议实现的是基于浏览器的原生socket,这样原先只有在c/s模式下的大量开发模式都可以搬到web上来了,基本就是通过浏览器的支持在web上实现了与服务器端的socket通信。
WebSocket没有试图在HTTP之上模拟server推送,而是直接在TCP之上定义了帧协议,因此WebSocket能够支持双向的通信。
首先来介绍下websocket客户端与服务端建立连接的过程:
先用js创建一个WebSocket实例,使用ws协议建立服务器连接,ws://www.cnodejs.org:8088
ws开头是普通的websocket连接,wss是安全的websocket连接,类似于https。
客户端与服务端建立握手,发送如下信息:
GET /echo HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: http://www.cnodejs.org:8088
Origin: http://www.cnodejs.com
服务端会发回如下:
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://www.cnodejs.org
WebSocket-Location: ws://www.cnodejs.org:8088/echo
具体的ws协议,可以参考: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76
我们在开发过程中不需要考虑协议的细节,因为websocket API已经帮我们封装好了。
需要注意的是所有的通信数据都是以”\x00″开头以”\xFF”结尾的,并且都是UTF-8编码的。
这个过程类似于http的建立连接过程,不同的是,建立连接之后,接下来客户端和服务端的任何交互都需要再有这个动作。客户端通过websocket API提供的如下4个事件进行编程:
onopen 建立连接后触发
onmessage 收到消息后触发
onerror 发生错误时触发
onclose 关闭连接时触发
让我们全面了解一下websocket API,他其实非常简单,下面是所有的API:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [Constructor(inDOMString url, inoptional DOMString protocols)][Constructor(inDOMString url, inoptional DOMString[] protocols)]interface WebSocket {readonly attribute DOMString url; // ready stateconst unsigned short CONNECTING = 0;const unsigned short OPEN = 1;const unsigned short CLOSING = 2;const unsigned short CLOSED = 3;readonly attribute unsigned short readyState;readonly attribute unsigned long bufferedAmount; // networkingattribute Function onopen;attribute Function onmessage;attribute Function onerror;attribute Function onclose;readonly attribute DOMString protocol;void send(inDOMString data);void close();};WebSocket implements EventTarget;
详细的websocket API,可以参考此文: http://dev.w3.org/html5/websockets/
node.js与websocket的结合
终于讲到了正题了,node.js如何与websocket结合,websocket API是基于事件的,他是对于客户端而言,而对于服务端来说,如何来处理呢?其实可以简单的理解为实现websocket协议的socket server开发。
node.js天生就是一个高效的服务端语言,可以直接使用javascript直接来处理来自客户端的请求,这样如果服务端这边需要大量的业务逻辑开发,则可以直接使用node开发。通过node和websocket的结合可以开发出很多实时性要求很高的web应用,如游戏、直播、股票、监控、IM等等。
而node.js如何实现websocket的支持,已经有一个比较成熟的开源系统node-websocket-server: https://github.com/miksago/node-websocket-server,让我们来探究一二:
其实原理也是很简单就是用node实现了websocket draft-76的协议,同时他对外提供了api,可以方便其他应用程序简化编程。
它继承了node的http.Server的事件和方法,这样它简化了服务端的编程,同时可以处理http的请求。
为了实现连接之间的通信和消息的广播,它实现了一个manager类,给每一个连接创建一个id,然后在内存中维护一个连接链表,并提供了上线和下线的自动管理。
它还提供对以下几个事件的接口:
listening 当服务器准备好接受客户端请求时
request 当一个http 请求发生时触发
stream
close
clientError
error
让我们看看一个node-websocket-server提供的一个server的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 varsys = require("sys") , ws = require('../lib/ws/server'); varserver = ws.createServer({debug: true}); // Handle WebSocket Requestsserver.addListener("connection", function(conn){ conn.send("Connection: "+conn.id); conn.addListener("message", function(message){ conn.broadcast("<"+conn.id+"> "+message); if(message == "error"){ conn.emit("error", "test"); } });}); server.addListener("error", function(){ console.log(Array.prototype.join.call(arguments, ", "));}); server.addListener("disconnected", function(conn){ server.broadcast("<"+conn.id+"> disconnected");}); server.listen(8000);
这个例子非常的简单,可以看到对于websocket的server端开发,我们已经不需要考虑websocket协议的实现,他几乎有着和客户端浏览器上websocket API一样的事件,只有对连接、断开连接、消息、错误等事件进行处理,这样应用的开发就非常的灵活了。
实例:用websocket和node.js搭建实时监控系统
通过websocket打通了浏览器和服务端之后,我们就可以尝试搭建一个实际的应用,这里以实时监控系统为例。
直接与linux自身监控工具的结合,将监控结果通过websocket直接更到网页上,由于建立了socket长连接,绑定iostat的标准输出的事件,做到了真正的实时。同时可以支持对监控结果的讨论,增加了一个简单的chat,基于事件的通讯中,chat和监控同时发送完全不受影响,所以还可以把更多的事件加入进来。
让我们来看看这个过程:
首先是用node.js捕获iostat的输出:
1 2 3 4 5 6 varsys = require("sys") , ws = require('../lib/ws/server'); varsys = require('sys');varspawn = require('child_process').spawn;varmon = spawn("iostat",["-I","5"]);
spawn可以根据参数启动一个进程,同时可以对stdout, stderr, exit code进行捕获,当这些事件触发时,可以绑定我们的函数,同时捕获其输出。
这里是iostat的标准输出:
disk0 cpu load average
KB/t tps MB/s us sy id 1m 5m 15m
14.64 4 0.06 7 5 88 0.76 0.95 0.90
我们捕获他的输出,将其发送到客户端去:
1 2 3 4 5 mon.stdout.on('data',function(data) { data = format_string(data); sys.puts(data); conn.send("#mon:"+data+"");});
客户端也就是浏览器,在收到消息后,对其进行简单的字符串处理,然后就可以直接在网页中输出了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 w.onmessage = function(e) { varmsg = e.data; if(msg.match(/#mon:/)) { varmonarr = msg.split(":")[1].split(" "); varbody = ""; for(varitem inmonarr) { body += "<td id='io_"+item+"'>"+monarr[item]+"</td>" } $("#iobody").html(body); //log(monarr[0]); } else log(e.data);}
这里自定义了一个#mon的简单协议,这样可以对更多类型的输出分开处理。
服务端和客户端总共100多行的代码,就已经实现了一个实时服务器性能监控系统。
全部代码下载地址: http://cnodejs.googlecode.com/svn/trunk/monsocket/examples/
(注:本程序仅在mac osx下测试通过)
如果加上RGraph(基于html5),则可以打造更加精美的实时展现: http://www.rgraph.net/docs/dynamic.html
总结
这篇文章适合node.js的初学者或者对于websocket不够了解的人,总结起来,就是以下几个点:
使用websocket API可以开发实时web应用
websocket api和 node.js可以很完美的配合
node-websocket-server 封装了websocket协议,使服务端进行websocket的开发,非常的简单
node的易用性,使其在服务端略加编程,即可以打造一个完美的后台服务
node的事件驱动的机制保证了系统的高效,可以使用EventEmitter定义自己的事件触发
对于命令行输出可以使用spawn来捕获,通过在web应用中充分利用linux的各种系统工具
参考资料
http://nodejs.org/
http://dev.w3.org/html5/websockets/
http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76
https://github.com/miksago/node-websocket-server
分享到:
相关推荐
包括 node.js参考手册、 Node入门、 websocket与node.js完美结合、 毕业论文-基于_HTML5_与_Nodejs_开发实时性网页对战游戏坦克大战(1)等。 初学node.js的快来尝鲜吧。
虽然Node.js本身是JavaScript,但可以与TypeScript完美结合,利用TypeScript的静态类型检查提升代码质量。 13. **集群(Cluster)模块** Node.js的`cluster`模块允许开发者充分利用多核处理器,提高服务器的并行...
《Node.js 应用开发》课程仓库中的内容主要聚焦于HTML5与移动互联网开发的结合,特别是通过Node.js这一强大的JavaScript后端框架进行应用构建。Node.js是基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用...
从上述内容可知,Node.js结合Socket.IO能够极大地简化即时通讯应用的开发流程,通过一系列的事件和API,开发者可以轻松实现包括用户连接与断开的监听、消息的发送接收以及各种数据的实时处理。 以一个简单的例子来...
标题 "nodejs服务端js编程发布html5" 涉及到的是使用Node.js作为后端服务器技术,结合JavaScript...这个过程展示了Node.js作为服务端平台与HTML5前端技术的完美融合,为现代Web开发提供了一种高效、灵活的解决方案。
在实际运行中,前端Cocos Creator与后端Node.js通过Ajax或者WebSocket进行数据交互。前端向后端发送玩家的操作请求,如出牌、碰牌等,后端接收到请求后处理逻辑并返回结果。此外,后端还需要处理玩家匹配、房间创建...
这个平台结合了Node.js的服务器端JavaScript能力与Chromium浏览器的渲染引擎,为开发者提供了一个高效且灵活的开发环境。 **核心特性** 1. **Node.js集成**:Node-WebKit继承了Node.js的特性,使得开发者可以直接...
在构建高性能的实时Web应用程序时,常常会遇到如何在Node.js环境中有效利用多核资源的问题。Socket.IO是一个流行的库,它提供了实时、双向通信的框架,而PM2则是一个流行的Node.js进程管理器,用于保持应用的稳定...
综上所述,这个你画我猜游戏项目充分利用了JavaScript生态系统中的优秀库和框架,将前后端完美结合,实现了流畅的用户交互和实时通信。通过深入学习和理解这些技术,开发者不仅能掌握游戏开发的基本流程,还能提升...
HTML5是现代Web开发的核心,它代表了Device(终端设备)与Cloud(云计算)的融合,将设计和技术完美结合。HTML5不仅关乎Cloud,更关键的是其对Device的支持,它引入了Device-Cloud模式,颠覆了传统的Client-Server...
"lrlz_h5_node"项目就是这样一个例子,它将H5的前端交互优势与Node.js的后端处理能力完美融合,打造了一款名为“lrlz购物中心”的在线平台。接下来,我们将深入探讨这个项目中的关键知识点。 一、HTML5技术 HTML5是...
ReactWithNode是一个全栈Web应用程序,它结合了Node.js、React、Redux、Express和MongoDB等技术,构建了一个用于电子邮件营销的平台。这个项目旨在展示如何将前端与后端完美融合,实现高效的数据管理和用户交互。 *...
**ReactSails:React与Sails.js的完美融合** ReactSails是将流行的前端JavaScript库React与后端框架Sails.js结合使用的示例项目。这个ReactTutorial应用程序旨在为开发者提供一个学习如何在Sails.js后端上构建React...
在IT行业中,Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程。Express.js是Node.js的一个Web应用框架,它为构建高效、可扩展的网络应用提供了许多便利。Socket....
微信小程序狼人杀是一款基于微信平台的在线社交游戏应用,它允许用户在微信环境中与朋友们进行狼人杀游戏...从技术角度分析,它涉及到了前端开发、后端服务、数据库设计、实时通信等多个方面,是技术与娱乐的完美结合。
在电子游戏领域,多人在线对战(Player versus Player,简称PvP)一直备受玩家喜爱,它提供了竞技、合作与策略的完美结合。本文将深入探讨一款名为"worldofpvp"的多人射击游戏,该游戏的核心开发语言是JavaScript,...
- 使用Node.js、Python的Flask/Django、Java的Spring Boot等后端框架处理请求和响应。 - 服务器端实现用户登录验证、好友关系管理、消息存储和分发等功能。 5. **数据库设计**: - 用户信息、好友列表、聊天记录...
此外,为了适应不同业务需求,可能还需要结合后端技术(如PHP、Node.js等)与数据库进行数据交互,实现动态内容加载和用户数据管理。 总的来说,《367_HTML手机电脑网站_网页源码移动端前端_H5模板_自适应响应式...
NestJS是一个基于Node.js的框架,用于构建高效、可扩展的服务器端应用程序。它结合了面向对象编程的强项,如类型Script,以及函数式编程的灵活性,如JavaScript。探查器(Profiler)在软件开发中是一个重要的工具,...
`hapi-webpack-dev-plugin`是这两个工具的完美结合,专为在hapi服务器上实现Webpack的开发环境配置而设计。 【描述】:hapi-webpack-dev-plugin `hapi-webpack-dev-plugin`的主要功能是在hapi服务器上集成Webpack...