node.js 使用示例
我们可以通过一些简单的实例来查看 Node 如何提高开发服务器的效率,事实上,使用 Node来编写一个简单的 echo 服务器,仅需要 6 行代码:
var net = require("net");
var server = net.createServer(function(socket){
socket.write("Echo server\n");
socket.pipe(socket);
});
server.listen(8580, "10.111.43.117");
我们在 8580 端口启动一个 socket 服务器,它将客户端的请求原封不动的返回:
[juntao@rd117 ~]$ telnet 10.111.43.117 8580 Trying 10.111.43.117...
Connected to rd117 (10.111.43.117).
Escape character is '^]'.
Echo server
hello, echo
hello, echo
Are you really node?
Are you really node?
bye
bye
^]
telnet> quit
Connection closed.
加粗的为服务器端返回的数据。require 是 node 中的包管理机制,net 是一个内置的模块,用以提供原生的 socket 访问。net 的 createServer 接受一个参数,其类型为一个函数,当有连接到达时,node 会调用这个函数。
下面是一个简单的 http 服务器,当接收到客户端请求之后,返回 200 及一个字符 串”hello,world”。
var http = require("http");
http.createServer(function(request, response){
response.writeHead(200, {"Content-Type":"text/plain"});
response.end("hello, world\n");
}).listen(9527, "10.111.43.117");
console.log("http server running at http://10.111.43.117:9527");
运行效果如下:
console 是一个全局的对象,console.log 用以在控制台上打印日志信息。通过 log,我们可以在后台监控客户端传递的数据。
最后来看一个传输文件的 Node 脚本:
var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs");
http.createServer(function(request, response) {
var uri = url.parse(request.url).pathname;
var filename = path.join(process.cwd(), uri);
path.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
return;
}
fs.readFile(filename, "binary", function(err, file) {
if(err) {
response.writeHead(500, {"Content-Type": "text/plain"});
response.write(err + "\n");
return;
}
response.writeHead(200);
response.write(file, "binary");
response.end();
});
});
}).listen(8080);
console.log("File Server running at http://localhost:8080/");
其中使用到了很多 Node 的模块:url,path,http,fs。如果文件不存在,则返回 404, 如果读文件出错,则返回 500,否则将文件内容写入 response,并终止连接。这个 http 服务器的根为 process.cwd(),即进程启动的目录,这样我们可以在另一个终端中,通过 curl 来请求上例中的 echo.js:
[juntao@rd117 ~]$ curl http://10.111.43.117:8080/echo.js
var net = require("net");
var server = net.createServer(function(socket){
socket.write("Echo server\n");
socket.pipe(socket);
});
server.listen(8580, "10.111.43.117");
事实上,使用 Node 作为一个间接层,可以极大的提高服务器的并发能力,将耗时的操作(数 据库,I/O 等)作为独立的进程。然后使用 Node 的高并发能力将数据存入一个队列,并通 知该独立进程进行耗时的操作。这种模式事实上是将单线程-事件模型-非阻塞与多线程结合起来,实践证明,这种模式是处理高并发,频繁业务很好的方式。
下图是一个典型的场景示意图:
再来看一个 node.js 中模块的使用,比如我们建立了一个模块,名叫 producter.js,其中 定义了一个变量和一个函数,然后想要在另一个模块 customer.js 中访问这个变量和函数。producter.js
中,定义了 pname 和 pfunc,然后通过 node.js 提供的 exports 来将其公开:
var pname = "javascript-core";
function pfunc(){
return "this is javascript-core";
}
exports.pname = pname;
exports.pfunc = pfunc;
然后在 customer.js 中,使用 require 来将这个模块导入:
var producter = require("./producter.js");
console.log(producter.pname);
var s = producter.pfunc();
console.log(s);
运行结果如下: javascript-core this is javascript-core
{$ activeFileHint $}