2012-05-05 43 views
6

Một vài tháng trước, tôi đã khám phá ra nowjs và dnode và cuối cùng sử dụng nowjs (và https://github.com/Flotype/nowclient) cho giao tiếp hai chiều của máy khách/máy chủ.Gửi tin nhắn từ máy chủ đến máy khách với dnode

nowclient cho phép giao tiếp nowjs giữa 2 quy trình nút (thay vì giữa quá trình nút và trình duyệt cho nowjs ra khỏi hộp). Sau đó tôi có thể gửi dữ liệu từ máy khách đến máy chủ và từ máy chủ đến máy khách. Bây giờ tôi sử dụng nút 0.6.12 và rất đau khi sử dụng nút 0.4.x để chạy ứng dụng khách.

Tôi đang xem xét kỹ hơn về dnode và tôi không thực sự chắc chắn cách thức giao tiếp của máy chủ đến máy khách đang hoạt động. Có thể máy chủ gửi tin nhắn trực tiếp cho khách hàng không? Ý tưởng là để có một khách hàng đăng ký trên máy chủ (tại kết nối đầu tiên) và cho phép máy chủ liên lạc với máy khách khi cần.

Từ những gì tôi hiểu, việc gọi một phương thức trên máy chủ là có thể nếu khách hàng đã yêu cầu thứ gì đó từ máy chủ ở vị trí đầu tiên. Đúng không ?

Trả lời

11

dnode sử dụng giao thức đối xứng để hai bên có thể xác định các hàm mà phe đối lập có thể gọi. Có 2 cách tiếp cận cơ bản mà bạn có thể thực hiện.

Cách thứ nhất là xác định chức năng đăng ký ở phía máy chủ và chuyển qua cuộc gọi lại từ máy khách.

server:

var dnode = require('dnode'); 

dnode(function (remote, conn) { 
    this.register = function (cb) { 
     // now just call `cb` whenever you like! 
     // you can call cb() with whichever arguments you like, 
     // including other callbacks! 

     setTimeout(function() { 
      cb(55); 
     }, 1337); 
    }; 
}).listen(5000) 

khách hàng:

var dnode = require('dnode'); 

dnode.connect('localhost', 5000, function (remote, conn) { 
    remote.register(function (x) { 
     console.log('the server called me back with x=' + x); 
    }); 
}); 

hoặc thay vào đó bạn có thể trực tiếp gọi điện cho khách hàng từ các máy chủ trong một thời trang đối xứng khi trao đổi phương pháp hoàn tất:

máy chủ:

var dnode = require('dnode'); 

dnode(function (remote, conn) { 
    conn.on('ready', function() { 
     remote.foo(55); 
    }); 
}).listen(5000); 

khách hàng:

var dnode = require('dnode'); 
dnode(function (remote, conn) { 
    this.foo = function (n) { 
     console.log('the server called me back with n=' + n); 
    }; 
}).connect('localhost', 5000); 
+0

Cám ơn giải thích của bạn. Máy khách có thể được kết nối với máy chủ và chờ cuộc gọi đến từ máy chủ không? Ngoài ra, có một định danh khách hàng mà phía máy chủ có thể sử dụng không? – Luc

+0

Tôi đã sử dụng conn.id và remote để theo dõi khách hàng. Đó là làm việc thực sự tuyệt vời. – Luc

+1

Chỉ nhận ra rằng câu trả lời này là từ việc thay thế anh ta. <3 dat guy - rất nhiều mô-đun tuyệt vời! – MiniGod

Các vấn đề liên quan