2015-05-21 3 views
0

Я ноб из node.js, и я следую примерам в «Node.js в действии». У меня есть вопрос о одном примере: Следующий код реализует простой сервер чата через telnet. Когда я пишу сообщение, сценарий должен отправлять сообщение всем подключенным клиентом.node.js eventListener не прослушивать

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

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

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

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); 

Но когда я пытаюсь подключиться через telnet и отправить сообщение, он не работает. Thanks

+0

Что вы ожидаете 'this.on ('broadcast', this.subscriptions),' делать? –

+0

Я ожидал, что когда кто-то отправит сообщение, каждый подключенный клиент получит его. Но я пытаюсь поставить console.log внутри событий соединения и данных, но так и не пришел. –

ответ

0

Пара вопросов, которые я заметил. См. Комментарии в коде.

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

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

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

    //added [id] to "this.subscriptions" 
    //Before you were passing in the object this.subscriptions 
    //which is not a function. So that would have actually thrown an exception. 
    this.on('broadcast',this.subscriptions[id]); 
}); 

var server = net.createServer(function(client) { 
    //This function is called whenever a client connects. 
    //So there is no "connect" event on the client object. 
    var id = client.remoteAddress+':'+client.remotePort; 
    channel.emit('join', id, client); 

    client.on('data',function(data) { 
     data = data.toString(); 
     channel.emit('broadcast',id,data); 
    }); 
}); 
server.listen(8888); 

Также обратите внимание: Если клиент отсоединяется и другой клиент отправляет сообщение, то this.clients[id].write(message); будет сгенерировано исключение. Это связано с тем, что на данный момент вы не слушаете событие разъединения и удаляете клиентов, которые больше не подключены. Таким образом, вы попытаетесь написать клиенту, который больше не подключен, который выдает исключение. Я предполагаю, что вы еще не добрались туда, но я хотел бы упомянуть об этом.

+0

Отлично! Основная проблема была вызвана client.on ('connect', function() {}); Мероприятия. Об отключенном пользователе, я должен реализовать эту часть. спасибо –

Смежные вопросы