windows上,按《了不起的nodejs》敲的代码。用net搭建服务器,然后用telnet登录两个客户端通信。两个客户端登录服务器之后,每次输入一个字母,另一个客户端就有信息返回了,请问怎样才能实现输入一个回车之后另一端才出现信息
/**
* Module dependencies.
*/
var net = require('net')
/**
* Keep track of connections.
*/
var count = 0
, users = {}
/**
* Create server.
*/
var server = net.createServer(function (conn) {
conn.write(
'\n > welcome 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.setEncoding('utf8');
// the nickname for the current connection
var nickname;
conn.on('data', function (data) {
// we remove the "enter" character
data = data.replace('\r\n', '');
// the first piece of data we expect is the nickname
if (!nickname) {
if (users[data]) {
conn.write('\033[93m > nickname already in use. try again:\033[39m ');
return;
} else {
nickname = data;
users[nickname] = conn;
for (var i in users) {
users[i].write('\033[90m > ' + nickname + ' joined the room\033[39m\n');
}
}
} else {
// otherwise we consider it a chat message
for (var i in users) {
if (i != nickname) {
users[i].write('\033[96m > ' + nickname + ':\033[39m ' + data + '\n');
}
}
}
});
conn.on('close', function () {
count--;
});
});
/**
* Listen.
*/
server.listen(3000, function () {
console.log('\033[96m server listening on *:3000\033[39m');
});
这个是telnet的机制问题,要var一个tmp变量对data进行缓冲。正好之前我问过类似的问题并找到了正确答案,这个问题你好像问了挺久了的,不知你现在是否还会疑惑,我贴上正确代码吧。
var net=require('net');
var count=0, users={};
var server=net.createServer(function(conn){
conn.write(
'\n\r > welcome to\033[92m node-chat\033[39m !'+
'\n\r > '+count+' other people are connected at this time.'+
'\n\r > please write your name and press enter: '
);
count++;
conn.setEncoding('utf8');
var nickname;
function broadcast(msg, exceptMyself){
for(var i in users){
if(!exceptMyself||i!=nickname){
users[i].write(msg);
}
}
}
var tmp = '';
conn.on('data',function(data){
tmp += data;
if (tmp.indexOf('\n') === -1) {
return;
}
data = tmp.replace(/\r|\n/g, '');
if(!nickname){
if(users[data]){
conn.write('\r\n\033[93m> nickname already in use. try again:\033[39m\r\n ');
tmp='';
return;
}else{
nickname=data;
users[nickname]=conn;
broadcast('\r\n\033[90m> '+nickname+' joined the room\033[39m\r\n');
}
}else{
broadcast('\r\n\033[96m> '+nickname+':\033[39m '+data+'\r\n');
}
tmp='';
});
conn.on('close',function(){
count--;
delete users[nickname];
broadcast('\r\n\033[096m> '+nickname+' left the room\033[39m \r\n');
});
});
server.listen(3000,function(){
console.log('\033[96m server listening on *:3000\033[39m');
});