素材牛VIP会员
windows下node搭建net服务器输入一个字符就响应怎么解决?
 bi***am  分类:Node.js  人气:1337  回帖:2  发布于6年前 收藏

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');
});
 标签:node.jsjavascript

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv7 码师
你***擦 Linux系统工程师 6年前#1

这个是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');
});
Lv6 码匠
问***m Linux系统工程师 6年前#2

这个只是telnet的机制,你默认进入的是字符模式,使用提示的 escape char 回到命令模式,然后 输入 mode line 进入行模式。

参考:http://bbs.csdn.net/wap/topic...

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取