除了 web 应用外, Node.JS 也被应用在许多方面, 如应用程序监控, 媒体流, 远程控制, 桌面和移动应用等等. 下面我们来看一下如何使用 Node.JS 实现聊天功能.
Node.JS 实现简单聊天功能:
服务器端代码:
- var.NET = require('net');
- var server = net.createServer();
- // 聚合所有客户端
- var sockets = [];
- // 接受新的客户端连接
- server.on('connection', function(socket){
- console.log('got a new connection');
- sockets.push(socket);
- // 从连接中读取数据
- socket.on('data', function(data){
- console.log('got data:', data);
- // 广播数据
- // 每当一个已连接的用户输入数据, 就将这些数据广播给其他所有已连接的用户
- sockets.forEach(function(otherSocket){
- if (otherSocket !== socket){
- otherSocket.write(data);
- }
- });
- // 删除被关闭的连接
- socket.on('close', function(){
- console.log('connection closed');
- var index = sockets.indexOf(socket);
- sockets.splice(index, 1);
- });
- });
- });
- server.on('error', function(err){
- console.log('Server error:', err.message);
- });
- server.on('close', function(){
- console.log('Server closed');
- });
- server.listen(4000);
客户端:
- var.NET = require('net');
- var port = 4000;
- var quitting = false;
- var conn;
- var retryTimeout = 3000; // 三秒, 定义三秒后重新连接
- var retriedTimes = 0; // 记录重新连接的次数
- var maxRetries = 10; // 最多重新连接十次
- process.stdin.resume();
- //process.stdin 流来接受用户的键盘输入, 这个可读流初始化时处于暂停状态, 调用流上的 resume() 方法来恢复流
- process.stdin.on('data', function(data){
- if (data.toString().trim().toLowerCase() === 'quit'){
- quitting = true;
- console.log('quitting');
- conn.end();
- process.stdin.pause();
- } else {
- conn.write(data);
- }
- });
- // 连接时设置最多连接十次, 并且开启定时器三秒后再连接
- (function connect() {
- function reconnect() {
- if (retriedTimes>= maxRetries) {
- throw new Error('Max retries have been exceeded, I give up.');
- }
- retriedTimes +=1;
- setTimeout(connect, retryTimeout);
- }
- conn = net.createConnection(port);
- conn.on('connect', function() {
- retriedTimes = 0;
- console.log('connect to server');
- });
- conn.on('error', function(err) {
- console.log('Error in connection:', err);
- });
- conn.on('close', function() {
- if(! quitting) {
- console.log('connection got closed, will try to reconnect');
- reconnect();
- }
- });
- // 打印
- conn.pipe(process.stdout, {end: false});
- })();
Node.JS.NET 模块提供了一些用于底层的网络通信的小工具, 包含了创建服务器 / 客户端的方法, 我们可以通过以下方式引入该模块:
- var.NET = require("net")
- net.createServer([options][, connectionListener])
创建一个 TCP 服务器. 参数 connectionListener 自动给'connection' 事件创建监听器.
process.stdin 属性返回连接到 stdin (fd 0) 的流. 它是一个 net.Socket 流 (也就是双工流), 除非 fd 0 指向一个文件, 在这种情况下它是一个可读流.
来源: http://www.css88.com/qa/node-js/11926.html