2014-01-29 92 views
0

要求模块聊天上的node.js

var net = require("net"); 

存储用户和连接数 变种计数= 0, 用户= {};

创建服务器

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

存储当前的昵称和设定utf8编码

var nickname; 
conn.setEncoding('utf8'); 

显示在外壳上的消息时,你stablish连接

conn.write(' > 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++; 

当recives数据时,它检查存储器中是否存在具有该名称的用户显示消息并返回。否则显示欢迎消息。否则,如果您输入消息或任何数据(在注册您的昵称后)在shell上显示它。

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; 

      for(var i in users) { 
       users[i].write('\033[90m > ' + nickname + ' joined the room\033[39m\n'); 
      } 
     } 
    } else { 
     for(var i in users) { 
      if(i != nickname) { 
       users[i].write('\033[96m > ' + nickname + ':\033[39m ' + data + '\n'); 
      } 
     } 
    } 
}); 

当您关闭或结束连接时,会从存储中删除您的昵称,并显示一条消息。 3000端口

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

conn.on('close', function(){ 
    count--; 
    delete users[nickname]; 
    conn.write('\033[90 > ' + nickname + ' left the room\033[39m\n'); 
}); 
}); 

服务器我在聊天的错误。我使用de shell建立了两个telnet连接。但是当我关闭另一个关闭两个,并向我显示一条错误消息。我的代码有什么问题?

回答

0

您正在尝试将write设置为关闭连接,因为写入关闭的Writable流会导致错误。

conn.on('close', function(){ 
    count--; 
    delete users[nickname]; 
    conn.write('\033[90 > ' + nickname + ' left the room\033[39m\n'); 
}); 

你想要的是要么使用Object.keysfor-in循环广播消息给所有其他用户。

conn.on('close', function() { 
    count --; 
    delete users[nickname]; 
    Object.keys(users).forEach(function (user) { 
    users[user].write(nickname + ' left the room'); 
    }); 
} 

您也不需要单独的count变量来跟踪连接的用户。

Object.keys(users).length; 

But when I close one the other one close two, and shows me a error message

那是因为你不听为error事件,默认情况下,一个EventEmitter如果发生错误,并且没有错误侦听器附加抛出一个错误。

conn.on('error', console.log); 
+0

当我添加该代码并关闭连接时出现: 由外部主机关闭的连接。 events.js:82 throw er; //未处理'错误'事件 ^ 错误:此套接字已由对方 在Socket.writeAfterFIN [as write](net。js:265:12) at /home/michel/Escritorio/ejemplos-nodejs/chat/index.js:45:9 at Array.forEach(native) at Socket。 (/home/michel/Escritorio/ejemplos-nodejs/chat/index.js:44:25) at Socket.EventEmitter.emit(events.js:104:17) at TCP.close(net.js:458 :12) – mishelashala

+0

是的,请参考我文章的最后部分。你需要为'conn'附加一个'error'处理程序 –