nodejs中基于TCP协议时下的类IRC程序(中继聊天程序)

来源:互联网 发布:聚氨酯 js聚合物 编辑:程序博客网 时间:2024/04/29 18:22

参考书目:《了不起的nodejs》

服务器代码:

var net = require('net');var count = 0;var users = {};var server = net.createServer(function(conn){console.log('\033[90mnew connection! \033[39m');conn.setEncoding('utf8');var nickname;conn.write('\n>welcom to \033[92mnode-chat\033[39m!'+ '\n' + count + 'other people are connected at this time.'+ '\n > please write your name and press enter:' );count++;conn.on('data',function(data){data = data.replace('\r\n','');if(!nickname){if(users[data]){conn.write('\033[93m> nickname already in use. try again:\033[39m ');return;}else{nickname = data;users[nickname] = conn;broadcast('\033[90m > '+ nickname + '  joined the room\033[39m\n' );}}else{broadcast('\033[96m > ' + nickname + ':\033[39m ' + data + '\n',true);}console.log(data);});conn.on('close',function(){console.log('coming in the close handle');count--;delete users[nickname];broadcast('\033[90m > ' + nickname + 'left the room\033[39m\n',true);console.log('users =');for(var i in users){console.log(i);}console.log('count = '+ count);console.log('-------------');});conn.on('error',function(err){console.log('coming in the handle: ' + err);});function broadcast(msg,exceptMyself){for(var i in users){if(!exceptMyself || i != nickname){users[i].write(msg);}}}});server.listen(3000,function(){console.log('\033[96mserver listening on * : 3000\033[39m');});

listen的回调函数是服务器运行开始就调用,createServer的回调函数是客户端链接成功之后才会调用



客户端代码:

var net = require('net');var stdin = process.stdin;var nickname;var client = net.connect(3000,'localhost');client.setEncoding('utf-8');client.on('connect',function(){console.log('connect successfully');stdin.resume();stdin.setEncoding('utf8');stdin.on('data',handleData);});function handleData(data){if(!nickname){nickname = data;nickname = nickname.replace('\r\n','');}client.write(data);}client.on('data',function(data){console.log(data);});

运行截图:




0 0
原创粉丝点击