Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
441 views
in Technique[技术] by (71.8m points)

windows下node搭建net服务器输入一个字符就响应怎么解决?

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(
      '
 > welcome to 33[92mnode-chat33[39m!'
    + '
 > ' + count + ' other people are connected at this time.'
    + '
 > 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('
', '');

    // the first piece of data we expect is the nickname
    if (!nickname) {
      if (users[data]) {
        conn.write('33[93m > nickname already in use. try again:33[39m ');
        return;
      } else {
        nickname = data;
        users[nickname] = conn;

        for (var i in users) {
          users[i].write('33[90m > ' + nickname + ' joined the room33[39m
');
        }
      }
    } else {
      // otherwise we consider it a chat message
      for (var i in users) {
        if (i != nickname) {
          users[i].write('33[96m > ' + nickname + ':33[39m ' + data + '
');
        }
      }
    }
  });

  conn.on('close', function () {
    count--;
  });
});

/**
 * Listen.
 */

server.listen(3000, function () {
  console.log('33[96m   server listening on *:300033[39m');
});

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

这个是telnet的机制问题,要var一个tmp变量对data进行缓冲。正好之前我问过类似的问题并找到了正确答案,这个问题你好像问了挺久了的,不知你现在是否还会疑惑,我贴上正确代码吧。

var net=require('net');

var count=0, users={};

var server=net.createServer(function(conn){
    conn.write(
        '

 > welcome to33[92m node-chat33[39m !'+
        '

 > '+count+' other people are connected at this time.'+
        '

 > 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('
') === -1) {
            return;
        }
        data = tmp.replace(/
|
/g, '');
        if(!nickname){
            if(users[data]){
                conn.write('
33[93m> nickname already in use. try again:33[39m
 ');
                tmp='';
                return;
            }else{
                nickname=data;
                users[nickname]=conn;

                broadcast('
33[90m> '+nickname+' joined the room33[39m
');
            }
        }else{
            broadcast('
33[96m> '+nickname+':33[39m '+data+'
');
        }

        tmp='';
        
    });

    conn.on('close',function(){
        count--;
        delete users[nickname];
        broadcast('
33[096m> '+nickname+' left the room33[39m 
');
    });
});

server.listen(3000,function(){
    console.log('33[96m server listening on *:300033[39m');
});

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...