啟動(dòng)腳本app.js如下:
#!/usr/bin/env node
var events = require('events');var net = require('net');var channel = new events.EventEmitter();channel.clients = {};channel.subscriptions = {};
/*添加join事件的監(jiān)聽器,保存用戶的client對象,以便程序可以將數(shù)據(jù)發(fā)送給用戶*/
channel.on('join',function(id,client){ this.clients[id] = client;this.subscriptions[id] = function(senderId,message){
/*忽略發(fā)出這一廣播數(shù)據(jù)的用戶*/
if(id != senderId){ this.clients[id].write(message); }}
/*添加一個(gè)專門針對當(dāng)前用戶的broadcast事件監(jiān)聽器*/
this.on('broadcast',this.subscriptions[id]);
/*client連接進(jìn)來,顯示歡迎字幕,并統(tǒng)計(jì)當(dāng)前client數(shù)量*/
var welcome = "Welcome!/n"+'Guests online: '+this.listeners('broadcast').length;client.write(welcome+'/n');
/*通知其它c(diǎn)lient用戶,當(dāng)前client用戶進(jìn)入聊天室*/
channel.emit('broadcast',id,id+' come in the chat./n');});
/*添加client用戶離開的leave事件的監(jiān)聽器,通知所有人client用戶離開了*/
channel.on('leave',function(id){ channel.removeListener( 'broadcast',this.subscriptions[id]); channel.emit('broadcast',id,id+' has left the chat./n');});
/*關(guān)閉聊天室,移出所有監(jiān)聽*/
channel.on('shutdown',function(){channel.emit('broadcast','','chat has shut down./n'); channel.removeAllListeners( 'broadcast');});
/*設(shè)置最大監(jiān)聽的數(shù)量,默認(rèn)超過10個(gè)監(jiān)聽會(huì)*/
channel.setMaxListeners(50);
var server = net.createServer(function(client){ var id = client.remoteAddress + ':' + client.remotePort;console.log('client id '+id);
/*當(dāng)有client用戶連接到服務(wù)器上來時(shí)發(fā)出一個(gè)join事件*/
channel.emit('join',id,client); client.on('data',function(data){data = data.toString();console.log(data);
/*收到s字符,關(guān)閉聊天室*/
if(data == "s"){console.log(data);channel.emit('shutdown');}else{
/*廣播聊天信息*/
channel.emit('broadcast',id,data);
}
});
/*添加client用戶斷開連接的監(jiān)聽事件*/
client.on('close',function(){channel.emit('leave',id); });});server.listen(3000);console.log('started ... ');
啟動(dòng)node服務(wù):node app.js
操作系統(tǒng)命令行,輸入命令,進(jìn)入聊天室:telent 127.0.0.1 3000
多開幾個(gè)命令窗口,查看效果。
新聞熱點(diǎn)
疑難解答
圖片精選