2016-02-18 2 views
3

Дорогие друзья У меня есть небольшая проблема, пытаясь отслеживать зарегистрированных пользователей в чате. Чат основан на два отдельных каналов, которые работают с помощью пространств имен:node.js/socket.io - отслеживать клиентов

  1. chatInfra - для ручки зарегистрированных пользователей и отправлять приветственные сообщения.
  2. chatCom - для обработки сообщений между пользователями.

Я много искал, но нашел только теоретические объяснения, что наилучшим решением является хранение пользователей в массиве. Поэтому я попытался сохранить отслеживание зарегистрированных пользователей, сохранив их в массиве, а затем итерации через них, но результат не очень хорош.

Проблема заключается в том, что после входа в чат на экране появляется только первое зарегистрированное имя пользователя, тогда как второе имя пользователя не отображается.

Это мой код на стороне сервера, я пытаюсь сохранить пользователей в clients массива:

var clients = []; 

    var chatInfra = io.of("/chat_infra").on("connection", function(socket){ 
     socket.on("set_name", function (data) { 
      clients.push(data.name); 
      socket.emit('name_set', data); 
      socket.send(JSON.stringify({ 
      type:'serverMessage', 
      message:'Welcome!' 
     })); 
     socket.broadcast.emit('user_entered', data); 
     }); 
    }); 

    var chatCom = io.of("/chat_com").on("connection", function (socket) { 
     socket.on('message', function (message) { 
      message = JSON.parse(message); 
      for(var key in clients){ 

       if(message.type == "userMessage"){ 
        message.username = clients[key]; 
        console.log('message : ', message); 
        socket.broadcast.send(JSON.stringify(message)); 
        message.type = "myMessage"; 
        socket.send(JSON.stringify(message)); 
       } 
      } 

     }); 
    }); 

Вот как это выглядит в браузере: http://screencast.com/t/lshnfcGZ8E8

Вот полный код: https://gist.github.com/johannesMatevosyan/0b9f7e588338dbb6b7f5

ответ

3

Я думаю, что вы создаете ненужный перебор, используя разные пространства имен. Вот понятнее рабочий пример достижения той же функциональности:

server.js

var app = require("express")(); 
var server = require("http").Server(app); 
var io  = require("socket.io")(server); 

var chat = io.of("/chat").on("connection", function(socket){ 

    socket.on("set_name", function (data) { 

     socket.username = data.name; 

     socket.emit("name_set", data); 
     socket.emit("message", { 
      type :"serverMessage", 
      message :"Welcome!" 
     }); 
     chat.emit("message", { 
      type :"serverMessage", 
      message : data.name + " has joined the room.!" 
     }); 
    }); 

    socket.on("message", function (message) { 
     message.username = socket.username; 
     chat.emit("message", message); 
    }); 
}); 


app.get("/", function (req, res) { 
    res.sendfile(__dirname + "/index.html"); 
}); 

server.listen(3000); 

client.js

var socket = io.connect('http://localhost:3000/chat'); 

socket.on('name_set', function (data) { 
    $('#nameform').hide(); 
    $('#messages').append('<div class="systemMessage">Hello ' + data.name + '</div>'); 
}); 

socket.on('message', function (message) { 
    var userNameHtml = message.username ? '<span class="name">' + message.username + ':</span>' : ''; 
    $('#messages').append('<div class="' + message.type + '">' + userNameHtml + message.message + '</div>'); 
}); 

$(function() { 

    $('#setname').click(function() { 
     socket.emit("set_name", { name: $('#nickname').val() }); 
    }); 

    $('#send').click(function() { 
     socket.emit("message", { 
      message : $('#message').val(), 
      type : 'userMessage' 
     }); 
     $('#message').val(''); 
    }); 
}); 

Я не думаю, что вам нужен отдельный обработчик событий для user_entered, так как вы рассматриваете его как обычное сообщение и ничего не делаете с событием. Также несколько вещей:

  • Вам не нужно сначала подключаться к серверу, а затем к адресу пространства имен, при подключении к нему в порядке.
  • Не устанавливайте прослушиватели событий в обратных вызовах, что приведет к их установке несколько раз.
+0

спасибо за ответ, но он показывает неопределенное 'message.username = client.username;' значение. – johannesMatevosyan

+0

Это проблема порядка исполнения, я думаю. У вас есть другие ошибки в коде клиента. Например, вы устанавливаете новых прослушивателей событий в обработчик события name_set каждый раз, когда вы получаете сообщение. – cviejo

+0

Попробует обновить рабочую версию. – cviejo

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