posted by Tran Thi Thu Thuy on 2014-07-01 21:39

Bạn đã từng nghĩ đến một nền tảng xây dựng ứng dụng, lập trình một cách nhanh, nhẹ, tối ưu hóa và đặc biệt là có thể chạy trên cả server lẫn client chưa ? Node.js sẽ giúp bạn làm được điều này.

I. Vì sao phải sử dụng Node.Js???

  - Node.js là ngôn ngữ phổ biến (100% lập trình viên web đều phải biết JavaScript)

        +Node.js sử dụng Javascript để lập trình cho cả client side và server side, đưa Javascript từ một ngôn ngữ thuần client side có thể thực hiện các công việc phía sever mà trước đây phải do PHP, Ruby in Rails, Perl,... thực hiện.

  - Lập trình web theo phong cách non-blocking I/O, tức một server có thể giữ cả trăm ngàn kết nối cùng lúc (thuận lợi cho sự xuất hiện của HTML5, CSS3, Webworker).

  - Tốc độ nhanh (nhờ V8)

  - Nhiều thư viện, dễ cài (nhờ chương trình npm để quản lí thư viện).

II. Giới thiệu chung.

1. Hệ thống modules của node.js

Trong Node, mỗi file tương ứng một module, sử dụng bằng cách gọi method require với tham số là tên module.

Ví dụ:

var db_adapter = require('./db_adapter.js');

Lệnh trên nạp module trong file db_adapter.js và đưa nào biến db_adapter

Mặc định các biến trong một module được gán phạm vi là private, nếu muốn module khác dùng được thì phải dùng đối tượng exports. Ví dụ:

exports.done = true;

2. 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.

3. 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.

III. Cài đặt node.js

1)Install Node.js vaò http://nodejs.org/ để tải.
2) Mở CMD lên gõ dòng này vào:

npm install -g express

3)Lưu đoạn mã helloworld sau  vào file example.js bỏ ngoài Desktop.

var http = require("http");

http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Hello World");
    response.end();
}).listen(80);

4).Mở CMD lên và trỏ tới nó.



5) Mở http://127.0.0.1:8124/ và xem kết quả.

IV.Tìm hiểu Socket.IO và xây dựng ứng dụng webchat.

Socket.IO là một thư viện javascript có mục đích tạo ra các ứng dụng realtime trên trình duyệt cũng như thiết bị di động. Việc sử dụng thư viện này cũng rất đơn giản và giống nhau ở cả server lẫn client. Sau đó cài mở cửa sổ console và cài đặt Socket.io bằng lệnh sau:

npm install socket.io

1. Tìm hiểu về 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ểu về 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 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ó thể là đố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 webchat.

a. Xây dựng một webchat server cơ bản. Trước tiên, ta sẽ nhập các mô-đun Socket.IO.

var exp = require('express');

var app = exp.createServer();

 

 Sau đó, ta sẽ tạo ra một biến toàn cục duy nhất của Socket.IO được sử dụng để chia sẻ trên nhiều ứng dụng.

global.socket = require('socket.io').listen(app);

global.socket.set('log level', 1);

global.socket.set('transports', [ 'websocket', 'flashsocket','htmlfile', 'xhr-polling', 'jsonp-polling']);

 

Ta sẽ tải tập tin cấu hình, router, và một mô-đun chat-socket đã có sẵn trong cùng một thời điểm.

require('./app/config')(app, exp);

require('./app/server/router')(app);

require('./app/server/modules/chat-socket');

 

Và sau đó khởi động server.

app.listen(8080, function(){

    console.log("Express server listening on port %d in %s mode",

app.address().port, app.settings.env);

});

 

b. Tạo module Server-Side chat socket.

Điều đầu tiên ta cần làm là xác định không gian tên cho ứng dụng này. Ta làm điều này với câu lệnh socket.of ('namespace').

module.exports = function()

{  

    global.socket.of('/chat').on('connection', function(socket) {

  console.log("a user has connected to the 'chat' namespace");

    });

}();

 

Bây giờ ta có thể thêm một số code để theo dõi người sử dụng kết nối, phát tin nhắn của họ và lắng nghe khi họ ngắt kết nối.

Nhưng trước tiên hãy tạo một mảng các màu mà ta ngẫu nhiên sẽ gán cho người dùng họ kết nối để phân biệt nhau trong bảng chat.

var colors = ['#AE331F', '#D68434', '#116A9F', '#360B95', '#5F209E'];

Tiếp theo ta sẽ tạo ra một " connections object " để theo dõi người dùng kết nối.

var connections = { };

Kịch bản phía client sẽ phát ra một sự kiện "user-ready" sau khi một người kết nối thành công và được giao một tên. Server sẽ lưu trữ giá trị đó trong socket server để sử dụng trong tương lai. Server cũng sẽ giao cho người sử dụng mới được kết nối một màu ngẫu nhiên từ mảng màu sắc có sẵn.

global.socket.of('/chat').on('connection', function(socket) {

    socket.on('user-ready', function(data) {    

    socket.name = data.name;

    socket.color = data.color = colors[Math.floor(Math.random() *

colors.length)];

// let everyone else in the room know a new user has just connected //

    brodcastMessage('user-ready', data);

});

 

Ta sẽ lắng nghe cho đến khi họ ngắt kết nối, do đó ta có thể loại bỏ chúng từ các đối tượng kết nối và thông báo cho người sử dụng.

socket.on('disconnect', function() {

delete connections[socket.id]; 

    dispatchStatus();

    brodcastMessage('user-disconnected', { name : socket.name, color :

socket.color });

});

 

dispatchStatus và broadcastMessage chỉ là các shortcut để phát sự kiện trở lại với phần còn lại của nhóm.

function dispatchStatus()

{

    brodcastMessage('status', connections);

}

function brodcastMessage(message, data)

{

    socket.emit(message, data);

    socket.broadcast.emit(message, data);

}

 

Khi một người dùng gửi tin nhắn cho thêm màu sắc kết hợp với Socket của mình vào tin nhắn để chúng tôi có thể hiển thị màu sắc thích hợp trong nhật ký trò chuyện khi phát trở lại với phần còn lại của nhóm.

socket.on('user-message', function(data) {

    data.color = socket.color;

    brodcastMessage('user-message', data);

});

 

c. Khởi tạo kết nối trên Client

Khi một người dùng kết nối với ứng dụng webchat, ta sẽ cung cấp cho họ một tên mặc định. Khi gửi tin nhắn, ta sẽ lấy giá trị này và thêm nó vào tin nhắn được gửi đi.

$('#name').val(Math.random().toFixed(8).toString().substr(2));

socket = io.connect('/chat');

 

Đó là những không gian tên riêng biệt cho phép các ứng dụng chat có thể duy trì quyền tự chủ trong khi chạy như tên miền phụ của ứng dụng Node.

$('#btn-send').click(function(){ sendMessage(); })

var sendMessage = function() {     socket.emit('user-message', {name : $('#name').val() , message :

$('#msg').val() });

    $('#msg').val('');

}

 

SendMessage chỉ đơn giản là lấy các giá trị được lưu trữ trong trường nhập tên và trường văn bản # msg #, khiến chúng thành một đối tượng mà chúng ta có thể phát ra trở lại máy chủ. Sau khi tin nhắn được gửi chúng tôi sẽ tự động xóa vùng văn bản # msg # vì vậy người dùng có thể gửi một tin nhắn mới.Phần còn lại của các mã trên client chỉ đơn giản là lắng nghe cho các sự kiện đến và cập

nhật các cuộc hội thoại phù hợp.

socket.on('user-ready', function (data) {

    $('#incoming').append('<span class="shadow"

style="color:'+data.color+'">'+data.name +' :: connected</span><br>');

});

socket.on('user-message', function (data) {

    $('#incoming').append('<span class="shadow"

style="color:'+data.color+'">'+data.name +' :: '+

data.message+'</span><br>');

});

socket.on('user-disconnected', function (data) {

    $('#incoming').append('<span class="shadow"

style="color:'+data.color+'">'+data.name +' :: disconnected</span><br>');

 

Lưu ý, trong trang HTML hãy chắc chắn rằng có bao gồm thư viện Socket.IO được để trong thư mục node_modules tại thư mục gốc của server.

<script src="/socket.io/socket.io.js"></script>

Tại thời điểm này, chúng ta đã có một server webchat đơn giản có thể lắng nghe và gửi tin nhắn cho tất cả người dùng kết nối không gian tên của ứng dụng "/ chat". Để có được các module và chạy, cd vào từng ứng dụng và cài đặt phụ thuộc của nó:

cd mydomain.com

npm install -d

 

Lưu và thoát khỏi các tập tin. Di chuyển vào bên trong thư mục mydomain.com và bắt đầu chạy ứng dụng. node app.js Bây giờ mở trình duyệt và vào đường dẫn :

http://localhost:8080

Kết quả:

 

Để biết thêm vào node.js bạn có thể tham khảo ở http://nodejs.org/ .


Leave a Comment

Fields with * are required.