听说过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);
        });

代码基本上可以执行,没有很仔细的调试,还是放上来,这里下载