Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 41 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
41
Dung lượng
546,5 KB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC KHOA HỌC
KHOA CÔNG NGHỆ THÔNG TIN
BÀI TIỂU LUẬN
MÔN : LẬP TRÌNH MẠNG
ĐềTài:Tìmhiểuvề node.js
Giáo viên hướng dẫn : Nguyễn Quang Hưng
Sinh viên thực hiện : Nguyễn Quang Hà
I. Giới thiệu 3
1. Lập trình không đồng bộ 3
2. Bạn phải làm tất cả 3
3. Module 5
4. Global Scope 6
5. Cộng đồng 6
II. Installation 6
1. Installing Node.js 6
2. Installing New Modules 7
III. Các objects cơ bản 7
1. Global Objects (đối tượng toàn cục) 7
2. Sự kiện (Event) 15
a. EventEmitter 15
b. Kế thừa từ EventEmitter ( Inheriting From EventEmitter ) 16
c. Loại bỏ các sự kiện lắng nghe (Removing Event Listeners) 17
3. Luồng ( Streams ) 17
a. Readable Streams 17
b. Writable Stream 19
4. File System 20
5. HTTP 22
6. Đọc thêm Nodejs Docs. 29
IV. Các ứng dụng được xây dựng trên nền Node.js 29
1. Ứng dụng đầu tiên 29
2. HTTP Server 29
3. Xử lý các tham số URL 30
4. Đọc và viết file 31
5. Nodejs với mysql 32
V. WebSocket với Node.js và Socket.IO 34
1. Tìmhiểuvề Socket.IO 34
2. Ứng dụng tính kết quả biểu thức cho trước 35
Sử dụng chương trình notepad hoặc công cụ soạn thảo lập trình nào đó để tạo 2 file sau 35
Server.js: 35
Client.html: 36
3. Ứng dụng webchat 37
TÌM HIỂUVỀ NODE.JS
I. Giới thiệu.
Node.js là một hệ thống phần mềm được thiết kế để viết các ứng dụng internet có khả
năng mở rộng, đặc biệt là máy chủ web. Chương trình được viết bằng JavaScript, sử dụng kỹ
thật điều khển theo sự kiện, nhập/xuất không đồng bộ để tối tiểu tổng chi phí và tối đại khả
năng mở rộng. Node.js bao gồm có V8 JavaScript engine của Google, libUV, và vài thư viện
khác.
Node.js được tạo bởi Ryan Dahl từ năm 2009, và phát triển dưới sự bảo trợ của Joyent.
Mục tiêu ban đầu của Dahl là làm cho trang web có khả năng push như trong một số ứng
dụng web như Gmail. Sau khi thử với vài ngôn ngữ Dahl chọn Javascript vì một API
Nhập/Xuất không đầy đủ. Điều này cho phép anh có thể định nghĩa một quy ước Nhập/Xuất
điểu khiển theo sự kiện, non-blocking.
Vài môi trường tương tự được viết trong các ngôn ngữ khác bao gồm Twisted
cho Python, Perl Object Environment cho Perl, libevent cho C và EventMachine cho Ruby.
Khác với hầu hết các chương trình Javascript, Nodejs không chạy trên một trình duyệt mà
chạy trên Server. Node.js sử dụng nhiều chi tiết kỹ thuật của CommonJS. Nó cung cấp một
môi trường REPL cho kiểm thử tương tác.
Node.js được InfoWorld bình chọn là “Công nghệ của năm” năm 2012.
Để bắt đầu dùng Node.js, bạn phải hiểu sự khác nhau giữa Node.js với các môi trường
truyền thống chạy trên server (server side) phổ biến như PHP, Python, Ruby, etc
1. Lập trình không đồng bộ
Là lợi thế nếu bạn đã quen thuộc với các phương pháp lập trình không đồng bộ. Tất cả các
hàm trong Node.js là không đồng bộ. Do đó, tất cả chạy như các block thread thông thường
thay vì chạy nền. Đây là điều quan trọng nhất để nhớ về Node.js. Ví dụ, nếu bạn đang đọc
một tập tin trên hệ thống tập tin, bạn phải chỉ định một chức năng gọi lại đó là thực hiện khi
đã hoàn thành các hoạt động đọc.
2. Bạn phải làm tất cả
Node.js chỉ là môi trường – điều đó có nghĩa là bạn phải tự làm tất cả. Đó không phải là
một server http ngầm định hoặc là bất cứ server nào khác. Điều này có thể là hơi khó hiểu
với người mới, nhưng thành công thực sự của nó là đưa lại một hiệu năng đáng kinh ngạc .
Một scrits có thể điều phối mọi kết nối với các client. Điều này làm sử dụng ít tài nguyên
đưa đến một hiệu quả rất cao. Ví dụ sau về một ứng dụng Node.js
var i, a, b, c, max;
max = 1000000000;
var d = Date.now();
for (i = 0; i < max; i++) {
a = 1234 + 5678 + i;
b = 1234 * 5678 + i;
c = 1234 / 2 + i;
}
console.log(Date.now() - d);
Và đây là tương đương với mã PHP:
$a = null;
$b = null;
$c = null;
$i = null;
$max = 1000000000;
$start = microtime(true);
for ($i = 0; $i < $max; $i++) {
$a = 1234 + 5678 + $i;
$b = 1234 * 5678 + $i;
$c = 1234 / 2 + $i;
}
var_dump(microtime(true) - $start);
Và giờ ta xem chấm điểm benchmark cho hai đoạn code trên khi chạy trên hai môi trường
khác nhau:
Number of iterations Node.js PHP
100 2.00 0.14
10’000 3.00 10.53
1’000’000 15.00 1119.24
10’000’000 143.00 10621.46
1’000’000’000 11118.00 1036272.19
Tôi thực hiện chạy hai đoạn code trên từ command line (console command) nên không có
trễ thao tác thực thi. Tôi chạy từng thử nghiệm 10 lần và lấy kết quả trung bình. PHP nhanh
hơn trong các lần chạy với số lượng nhỏ vòng lặp. Nhưng vấn đề thay đổi khi số lượng vòng
lặp tăng lên, số lần xử lý tăng lên thì PHP chạy chậm hơn rất nhiều trong khi Node.js có tốc
độ đáng kinh ngạc. Sau tất cả thao tác, PHP chậm hơn 93% so với Node.js.
3. Module
Node.js sử dụng một kiến trúc mô-đun để đơn giản hóa việc tạo ra các ứng dụng phức tạp.
Mô-đun giống như các thư viện trong C, hoặc các đơn vị trong Pascal. Mỗi module có chứa
một tập hợp các chức năng liên quan đến "đối tượng" của các mô-đun. Ví dụ, các mô-đun
http chứa các chức năng cụ thể cho HTTP. Node.js cung cấp một vài mô-đun cơ bản để giúp
bạn truy cập các tập tin trên hệ thống tập tin, tạo ra trình điều khiển server HTTP và TCP /
UDP và thực hiện các chức năng hữu ích khác.
Để gọi một modul thật dễ dàng, chỉ cần gọi hàm require() như sau
Var http = require(‘http’);
Hàm require() trả về tham chiếu đến các module quy định. Trong trường hợp của mã này,
một tham chiếu đến các module http được lưu trữ trong biến http. Trong đoạn code trên, ta đã
truyền tên của module vào trong hàm require(). Việc này chỉ định cho Node.jstìm trong thư
mục node_modules module tương ứng để thực hiện. Nếu Node không thấy module tương
ứng trong thư mục thì nó sẽ tìm trên global module cache. Bạn cũng có thể chỉ định một
module qua một file vật lý qua đường dẫn tương đối hay tuyệt đối như sau:
var myModule = require('./myModule.js');
Module được đóng gói từng phần mã. Đoạn mã nằm trong một mô-đun chủ yếu là private
- có nghĩa là các chức năng và biến được định nghĩa trong họ chỉ có thể truy cập từ bên trong
của các mô-đun. Tuy nhiên, bạn có thể tiếp xúc với chức năng và / hoặc các biến được sử
dụng từ bên ngoài của mô-đun. Để làm như vậy, phải sử dụng các đối tượng export với các
thuộc tính và phương thức của nó với từng phần mã mà bạn muốn gọi từ bên ngoài. Hãy xem
xét các modul ví dụ sau đây:
var PI = Math.PI;
exports.area = function (r) {
return PI * r * r;
};
exports.circumference = function (r) {
return 2 * PI * r;
};
Trong ví dụ này PI là biến private và chỉ được sử dụng bên trong đoạn mã, trong đó có hai
hàm area() và circumference() được từ khóa exports chỉ định thì sẽ có thể truy cập được từ
bên ngoài.
4. Global Scope
Node là một môi trường chạy javascrip với google V8 engine do đó hỗ trợ chạy được ở
server side. Do đó bạn cũng nên tuân thủ các kinh nghiệm mà bạn có trong lập trình với các
ứng dụng client-side. Ví dụ khi tạo các biến global trong Node không phải lúc nào cũng có
thể tạo. Nhưng bạn có thể tạo dễ dàng các biến hoặc hàm global với cách bỏ từ khóa var
trước các biến như sau:
globalVariable = 1;
globalFunction = function () { };
Nhưng các biến global nên tránh sử dụng, và xin nhớ cẩn thận rằng khi khai báo biến thì
dùng từ khóa var để thực hiện.
5. Cộng đồng
Cộng đồng phát triển Node.js chủ yếu tập trung ở hai nhóm google : nodejs và nodejs-dev,
một kênh IRC là #node.js trên mạng freenode. Có một hội thảo vềNode.js là NodeConf được
tổ chức thường niên.
Hiện nay Node.js được sử dụng bởi nhiều công ty trong đó có Linkedin, Microsoft,
Yahoo! và Walmart.
II. Installation
1. Installing Node.js .
Hiển nhiên là bạn phải học cách cài đặt node trước khi muốn viết và chạy bất cứ ứng dụng
nào trên nền node. Cài đặt node thì rất là đơn giản, bạn là người sử dụng window hay linux
thì trên website nodejs.org đều đã có những bộ cài tương ứng, bạn chỉ cần download về và
cài đặt như thông thường.
Với linux thì bạn sử dụng package manager, bật cửa sổ terminal và type:
sudo apt-get update
sudo apt-get install node
Hoặc:
sudo aptitude update
sudo aptitude install node
Bạn có thể cần thêm Node.js vào danh sách mã nguồn bằng lệnh sau:
sudo echo deb http://ftp.us.debian.org/debian/ sid main > /etc/apt/
sources.list.d/sid.list
Cần trọng khi cài sid packages trên những hệ thống cũ hơn có thể làm hệ thống của bạn bị
ảnh hưởng, hay cẩn thận và remove /etc/apt/sources.list.d/sid.list sau khi bạn cài xong Node.
2. Installing New Modules
Node.js có một ứng dụng quản lý packages, đó là Node Packgate Manager (NPM). Ứng
dụng này tự động được cài đặt khi bạn cài Node.js và bạn dùng NPM để cài đặt các module
khác. Để cài đặt một module, bạn mở cửa sổ command line của nodejs ra, vào đường dẫn
tương ứng và nhập lệnh:
npm install module_name
Không phụ thuộc vào hệ điều hành bạn dùng, lệnh trên sẽ cài module mà bạn mong muốn
chỉ định.
III. Các objects cơ bản.
1. Global Objects (đối tượng toàn cục).
Như chúng ta đã biết, hệ thống mô-đun của node không khuyến khích việc sử dụng biến
toàn cục, tuy nhiên node cung cấp một globals quan trọng để sử dụng. Việc đầu tiên và quan
trọng nhất là tiến trình global, cho thấy nhiều thao tác như quá trình truyền tín hiệu, xuất
cảnh, proccess id (pid), và nhiều hơn nữa. Globals khác, chẳng hạn như console obiects được
cung cấp cho những người sử dụng để viết JavaScript cho trình duyệt web.
a. Console
Các console obiects sử dụng một số lệnh được sử dụng để xuất thông tin để stdout hoặc
stderr. Chúng là các lệnh như:
console.log ([data], [ ])
Phương pháp console obiects được sử dụng thường xuyên nhất là console.log(), mà chỉ
đơn giản là viết cho stdout và gắn một nguồn cấp dữ liệu dòng (\ n
console.log (wahoo ');
// => Wahoo
console.log ({foo: 'bar'});
// => [Object Object]
Còn một lệnh có chức năng như console.log()đó là console.info().
console.error ([data], [ ])
Giống hệt nhau để console.log(), tuy nhiên viết cho stderr.
console.error ('kết nối cơ sở dữ liệu không thành công ');
Còn một lệnh có chức năng như console.error()đó là console.warn().
console.dir (obj)
Sử dụng phương pháp inspect() của mô-đun sys khá-in các đối tượng đến stdout.
console.dir ({foo: 'bar'});
/ / => {Foo: 'bar'}
console.assert (expression, [message])
Nếu expression bị đánh giá là có giá trị là false thì AssertionError sẽ đưa ra message
được cho.
console.assert (connected, 'Cơ sở dữ liệu kết nối không thành công ');
console.time(label)
Đánh dấu thời gian bắt đầu.
console.timeEnd (label)
Thời gian kết thúc, được ghi vào đầu ra.Ví dụ:
console.time('100-elements');
for (var i = 0; i < 100; i++) {
;
}
console.timeEnd('100-elements');
console.trace(label)
In một tập stack các dấu vết stderr của vị trí hiện tại.
b. Process
Các process object gắn liền với goodies. Trước tiên, chúng ta sẽ có một cái nhìn tại một số
thuộc tính cung cấp thông tin về node process đó:
process.version
Chuỗi phiên bản nút, ví dụ:
console.log (' Version:' + process.version); // Version v0.8.16
process.execPath
Đường dẫn đến thư mục thực thi chính của chương trình "/ usr / local / bin / node".
process.platform
Các nền tảng bạn đang sử dụng. Ví dụ, "darwin".
process.pid
Các process ID.
process.stdout ()
Một luồng có thể ghi được đến stdout.
Ví dụ: Định nghĩa về console.log().
console.log = function (d) {
process.stdout.write (d + '\ n');
};
process.stderr ()
Tương tự như process.stdout() nhưng ở đây là ghi đến stderr.
process.stderr() và process.stdout() là không giống như luồng khác trong Node,
khi viết chúng thường bị blocking. Chúng bị blocking trong trường hợp mà chúng liên quan
đến các tập tin thường xuyên hoặc mô tả tập tin TTY. Trong trường hợp chúng liên quan đến
các pipes, chúng không bị blocking như những luồng khác.
process.stdin ()
Một luồng có thể đọc được cho stdin. Các dòng stdin bị tạm dừng theo mặc định, do đó,
người ta phải gọi process.stdin.resume () đểđọc từ nó.
Ví dụ mở đầu vào chuẩn và lắng nghe cả hai sự kiện:
process.stdin.resume ();
process.stdin.setEncoding ('utf8');
process.stdin.on ('data', function (chunk) {
process.stdout.write ('data: ' + chunk);
});
process.stdin.on (end', function () {
process.stdout.write (' end');
});
process.cwd ( )
Trả về thư mục làm việc hiện tại. Ví dụ:
cd ~ && node
node> process.cwd() "/Users/tj"
process.chdir ( )
Thay đổi thư mục làm việc hiện tại.
process.chdir('/ foo');
process.getuid ( )
Trả về số user ID của process đang chạy.
process.setuid ( )
Thiết lập user ID có hiệu lực cho quá trình đang chạy. Phương pháp này chấp nhận cả một
số ID, cũng như một chuỗi. Ví dụ cả hai process.setuid(501), và
process.setuid('tj') đều hợp lệ.
process.getgid ( )
Trả về số group ID của process đang chạy.
process.setgid ( )
Tương tự như process.setuid() tuy nhiên được sử dụng trong group, cũng chấp nhận
một số giá trị hoặc chuỗi đại diện. Ví dụ, process.setgid(20) hoặc
process.setgid('www').
process.chdir (directory)
Thay đổi thư mục làm việc hiện tại của process hoặc đưa một ngoại lệ nếu thất bại.
console.log ('Starting directory: '+ process.cwd ());
try {
process.chdir ('/ tmp');
console.log ('New directory:' + process.cwd ());
}
catch (err) {
console.log ('chdir: '+ err);
}
process.env
Một đối tượng có chứa các biến môi trường của người sử dụng. Ví dụ:
{ PATH:
'/Users/tj/.gem/ruby/1.8/bin:/Users/tj/.nvm/current/bin:/usr/bin:/bin:/u
s
/sbin:/sbin:/usr/local/bin:/usr/X1
, PWD: '/Users/tj/ebooks/masteringnode'
, EDITOR: 'mate'
[...]... require('url').parse Phân tích cú pháp Ví d : node> require('url').parse('/status?name=ryan', true) { href: '/status?name=ryan', search: '?name=ryan', query: { name: 'ryan' }, pathname: '/status' } request.headers Đọc bản đồ duy nhất của tên header và giá trị Tên header là lower-cased Ví d : // In một cái gì đó nh : // {User-agent ':' curl/7.22.0 ' // Host: '127 0.0. 1:8 000 ', // accept: '*/*' } console.log(request.headers);... sau: npm install socket.io 1 Tìm hiểuvề Socket.IO Với Node.js, bạn chỉ cần biết vài hàm cơ bản như requires() để import thư viện Công việc còn lại, chỉ cần dùng Socket.IO nên bạn cần phải tìm hiểuvề thư viện này tại đây: http://socket.io/#how-to-use - Server: tạo một đối tượng socket bằng phương thức listen(port) Phương thức này chờ đợi một yêu cầu kết nối từ client - Client: Kết nối đến server bằng... tăng tốc tảivề response.resume () Tiếp tục lại một response bị tạm dừng 6 Đọc thêm Nodejs Docs Trên đây chỉ là các đối tượng cơ bản được nên ra, vẫn chưa được đầy đủ vì vậy muốn tìm hiểu sâu vềNode.js thì nên xem các tài liệu của Node API được biên soạn rất chi tiết và liệt kê tất cả các lệnh hệ thống tập tin có thể có sẵn khi làm việc với Node.js IV Các ứng dụng được xây dựng trên nền Node.js 1 Ứng..., LANG: 'en_CA.UTF-8' , SHLVL: '1' , HOME: '/Users/tj' , LOGNAME: 'tj' , DISPLAY: '/tmp/launch-YCkT03/org.x:0' , _: '/usr/local/bin/node' , OLDPWD: '/Users/tj' } process.argv Khi thực hiện một tập tin với các nút thực thi process.argv cung cấp truy cập vào các vector đối số, giá... request l : GET /status?name=ryan HTTP/1.1\r\n Accept: text/plain\r\n \r\n Thì request.url sẽ l : '/status?name=ryan' Nếu bạn muốn để phân tích các URL thành các phần của nó, bạn có thể sử dụng require('url').parse(request.url) Ví d : node> require('url').parse('/status?name=ryan') { href: '/status?name=ryan', search: '?name=ryan', query: 'name=ryan', pathname: '/status' } Nếu bạn muốn trích xuất các params... - Client: Kết nối đến server bằng phương thức connect(url,{port: server_port}) - Socket.IO cung cấp 3 event chính là connect, message và disconnect Chúng được kích hoạt khi client/server: + connect: tạo kết nối + message: nhận được thông điệp + disconnect: ngắt kết nối Ví d : socket.on("message", function(msg){ // console.log("Received: "+ msg); }); - Để gửi dữ liệu, ta dùng lệnh send() Dữ liệu có... tượng như thế này: { 'content-length ': '123', 'content-type ': 'text/plain', 'connection ': 'keep-alive', 'accept ': '*/*' } Key được lowercased và giá trị không được sửa đổi http.STATUS_CODES Một bộ sưu tập của tất cả các mã trạng thái tiêu chuẩn của HTTP response, và mô tả ngắn gọn cho từng cái Ví dụ, http.STATUS_CODES [404] === 'Not Found' http.createServer ([requestListener]) Trả về một đối tượng... đối tượng (được chuyển thành chuỗi json) và sẽ nhận được qua sự kiện message Ví d : socket.send("Hello world"); - Socket.IO có thể gửi và nhận các event tự tạo với phương thức emit() Hai phía gửi và nhận phải biết được tên của event đó để thực hiện giao tiếp: Ví d : // gửi: socket.emit("hello",{msg: "welcome"); // nhận: socket.on("hello", function (data) { console.log(data); } ); 2 Ứng dụng tính kết... function(){ // console.log('Disconnected'); }); }); Client.html: WebSocket Client window.onload = function(){ var input = document.getElementById('input'); var output = document.getElementById('output'); var socket = io.connect('localhost',{port: 8080}); socket.on("connect",function(){ console.log("Connected... thông số của URL Lưu file này thành get.js và thực thi trên cửa sổ lệnh: node get.js Sau đó vào đường dẫn: http://localhost:8080/?data=put_some_text_here để xem kết quả 4 Đọc và viết file Đểđọc và ghi file trong Node ta dùng fs module, một module sẵn có trong Node Các hàm đọc và ghi file là fs.readFile() và fs.writeFile() Ta có ví dụ sau: // Khai báo http module, var http = require("http"), // và mysql . triển Node. js chủ yếu tập trung ở hai nhóm google : nodejs và nodejs-dev,
một kênh IRC là #node. js trên mạng freenode. Có một hội thảo về Node. js là NodeConf. TIN
BÀI TIỂU LUẬN
MÔN : LẬP TRÌNH MẠNG
Đề Tài : Tìm hiểu về node. js
Giáo viên hướng dẫn : Nguyễn Quang Hưng
Sinh viên thực hiện : Nguyễn Quang Hà
I.