听说过nodejs大约在半年前,那个时候,下载一些服务的python客户端的时候,总发现有nodejs的客户端,于是就看了一些关于nodejs的资料。都是一些初浅的总结,算是自己花了时间的在nodejs上的一个见证吧。
nodejs,名称种带着一个js,让人浮想连篇,js主要的用于客户端的脚本语言,而nodejs实际上是用js做服务端,是不是很酷。而这个是怎么做的呢?实际上nodejs是使用了Google的V8虚拟机,来执行js的代码。
1. 安装(环境是ubuntu10.04)
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs
当然网上很多通过源码安装的,这里就不废话了。
打开终端,
~$ nodejs -v
v0.6.16
这样就安装成功了。
2. Hello World
创建helloworld.js,
console.log("Hello World");
保存之后用
nodejs helloworld.js来执行,于是我们就看到了著名的Hello World。跟js的写法是一样的。
3. httpserver
当然,单单一个Hello World是无法让我们认识nodejs的,来,试着创建一个server
创建server.js
var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.write("Hello World"); response.end(); }).listen(8000);
nodejs server.js
打开http://127.0.0.1:8000,熟悉的Hello World又出现在我们的视野中。
4. npm安装
npm是nodejs的模块安装管理的一个工具,nodejs的发展之快很难想象,据说短短的时间内就有3000多个模块,几乎涉及到各个领域。因此用npm进行管理是很有必要的。
有了上面的为nodejs添加源后,执行
sudo apt-get install npm
就能安装npm。npm是依靠网络的,现在的源在国外,国内好像还没有一个靠谱的镜像,因此用起来速度很慢。
5. 我的一些折腾
官方给出的nodejs的例子是一个聊天室,我的第一想法就是用nodejs实时系统。于是我nodejs+websocket做了一个web聊天系统,
server.js
exports.Talk = function(){ var users = {} //所有用户 var connections = []; var http = require("http"); var mime = require("./mine"); var readFile = require("fs").readFile; var io; config = {Port:8118,WPort:8119,} this.start = function(){ function onRequest(request, response) { if(request.url == '/'){ staticHandler(request, response, 'server/static/main.html'); }else if(request.url == '/jquery-1.3.2.js'){ staticHandler(request, response, 'server/static/jquery-1.3.2.js') } } this.Startup(); console.log('server is started, port :'+config.Port); http.createServer(onRequest).listen(config.Port); } var staticHandler = function (request ,response ,filename) { var extname = function(path) { var index = path.lastIndexOf("."); return index < 0 ? "" : path.substring(index); } var content_type = mime.lookupExtension(extname(filename)); function loadResponseData() { readFile(filename, function (err, data) { if (err) { console.log("Error loading " + filename); } else { var headers = { "Content-Type": content_type, "Content-Length": data.length}; response.writeHead(200, headers); response.end(data); } }); } loadResponseData(); }; //启动服务 this.Startup = function(){ io = require('socket.io').listen(config.WPort); io.sockets.on('connection', function (socket) { socket.on("join", OnJoin); socket.on("message", OnMessage); }); console.log('socket io server is started, port: ' + config.WPort); }; var OnJoin = function(data){ users[this.id] = data.nickname; connections[this.id] = this; this.emit("login", { "nickname" : data.nickname, "id":this.id, "all":users, }); } var OnMessage = function(data){ if(data.to == '0'){ io.sockets.emit("message",{"msg":data.msg,'nickname':data.nickname}); }else{ connections[data.to].emit("message", { "msg" : data.msg, 'nickname':data.nickname, }); this.emit("message",{"msg":data.msg,'nickname':data.nickname}); } } } #代码稍微解释一下 #导入socket.io模块 io = require('socket.io').listen(config.WPort); #启动监听并且绑定监听事件 io.sockets.on('connection', function (socket) { socket.on("join", OnJoin); socket.on("message", OnMessage); });
代码基本上可以执行,没有很仔细的调试,还是放上来,这里下载