2014-06-11 3 views
2

최근에 "Node.js in Action"책으로 Node.js를 학습하기 시작했습니다. chat_sever하는NodeJS events on ('connect') 오류

node chat_server.js 

그런 열어 새 터미널과 연결 :

telnet 127.0.0.1 8888 

그런 다음 다시 새 터미널 창을 열고 연결 내가 코드를 실행

var events = require('events'); 
var net = require('net'); 

var channel = new events.EventEmitter(); 
channel.clients = {}; 
channel.subsriptions = {}; 

channel.on('join', function (id, client) { 
    this.clients[id] = client; 
    this.subsriptions[id] = function (senderId, message) { 
     if (id !== senderId) { 
      this.clients[id].write(message); 
     } 
    }; 
    this.on('broadcast', this.subsriptions[id]); 
}); 

var server = net.createServer(function (client) { 
    var id = client.remoteAddress + ':' + client.remotePort; 
    client.on('connect', function() { 
     channel.emit('join', id, client); 
    }); 
    client.on('data', function (data) { 
     data = data.toString(); 
     channel.emit('broadcast', id, data); 
    }); 
}); 

server.listen(8888); 

: 장 목록이 다음입니다 chat_server. 이 책은 말한다 :

"당신은 몇 명령 줄을 열면, 당신은 다른 사람에게 반향되어 하나의 명령 줄에 입력하는 것을 볼 수 있습니다."

내가 입력하려고 하나의 단말기는 있지만 다른 단말기에는 아무 것도 울리지 않습니다. 무엇이 문제 일 수 있는가? 우분투 12.04를 실행하고

는 편집 :

나는이 부분을 디버깅하려고 :

client.on('connect', function() { 
     console.log('joined ' + id); 
     channel.emit('join', id, client); 
    }); 

를하지만 저를 표시하지 않습니다 내가 여러 터미널을 열 경우에도 "메시지에 합류했다".

+1

: 그리고으로 교체해야합니다. 빠른보기에서 나는 메시지가 모든 사용자에게 방송되지 않는다고 말할 것입니다. – maurycy

답변

2

나는 this SO question의 도움으로 내 문제를 해결 한 : 당신이 콜백을 얻을 때, 소켓이 이미 연결되어있는 서버 측

, 이벤트 당신은 '외설을들을려고 이미 소켓에 연결된 에서 방출되었습니다.

그래서 '클라이언트'외부에서 '연결'을 보냈습니다 ('연결'). 즉,이 코드는

client.on('connect', function() { 
     channel.emit('join', id, client); 
    }); 

아무 것도 수행하지 않습니다. 당신은 CONSOLE.LOG를 사용하여 chat_server.js에서 디버깅 할 수 있습니다

channel.emit('join', id, client);