2014-01-29 122 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'處理程序 –