如何让像facebook这样的多节点js聊天?

时间:2014-09-17 20:42:14

标签: node.js socket.io

好吧,我已经阅读了一些教程,我在使用express和socket io的节点js聊天,它运行良好! 所以,它的工作方式是: 打开端口3000中的URL的用户连接并且现在无法发送消息,如果另一个用户连接在同一个URL和端口,现在可以看到他可以发送消息的新消息。 我希望在同一个应用程序中有多个这样的场景,以制作像Facebook聊天!! 谢谢!

这是我的代码: 服务器端:

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

app.get('/', function(req, res){

res.sendFile(__dirname+'/index.html');

});

io.on('connection', function(socket){
console.log('a user connected');

socket.on('chat message', function(msg){
io.emit('chat message', msg);
});


 socket.on('disconnect', function(){
console.log('user disconnected');
});
});



http.listen(3000, function(){
console.log('listening on *:3000');
});

在客户端javascript:

 var socket = io();
  $('form').submit(function(){

    socket.emit('chat message', {message: $('#m').val(), type_msg: 'chat_message'});

    $('#m').val('');
    return false;
  });

  socket.on('chat message', function(msg){

   switch(msg.type_msg){
       case "chat_message":
             $('#messages').append($('<li>').text(msg.message));
           break;

        case "user_is_typing":
            $('#status').val(msg.message);
            break;

        case "user_is_not_typing":
           $('#status').val(msg.message);
            break;
       }     
      });


  $('#m').keypress(function(){

    socket.emit('chat message', {message: "User is typing! :D",type_msg: "user_is_writing"});
  });

  $('#m').keyup(function(){

    socket.emit('chat message', {message: "User in thinking...",type_msg: "user_is_typing"});
  });

1 个答案:

答案 0 :(得分:5)

我看到你的代码几乎与socket.io聊天教程相同。首先,如果您想进行类似Facebook的聊天,您必须考虑对用户进行身份验证,我建议您使用passport。我建议您查看这个example,如果您对在Web应用程序中实现类似内容有进一步的疑问,可以在自述文件的底部找到有用的链接。

一旦你实施了护照,你可以使用socket.io-passport模块(我为不提供链接而道歉,但我不允许发布超过2个链接与我的新手声誉)来确定哪个用户正在触发每个套接字连接,或者,如果要编写较少依赖的应用程序,可以编写自己的逻辑。例如,您可以通过在路由文件中写下类似的内容将req.user._id传递给客户端:

res.render('yourtemplate.ejs', { userId : req.user._id });

在客户端,您可以在加载页面后使用该ID触发一种握手事件:

var myId = '<%= userId %>';
socket.emit('handshake', myId);

并且,再次在服务器端,听取该事件并采取正确行动:

var userSocket = [];
socket.on('handshake', function (user) {
  if (userSocket[user] === undefined) userSocket[user] = [];
  userSocket[user].push(socket.id);
}

现在你有了一个二维数组,它可以识别每个用户使用的所有套接字。它允许您向特定用户发送消息:

socket.on('chat message', function (msg) {
  for (var i = 0 ; i < userSocket[msg.to].length ; i++ ) {
    io.to(userSocket[msg.to][i].emit('chat-message', msg);
  }
});

注意:正如您所看到的,msg已成为一个对象,而不是一个字符串。它遵循这种结构:

{
  from : userId,
  to   : userId,
  text : The message itself
}

这是一个非常严格的指导方针,但我认为这足以让您了解自己可以做些什么。当然,您必须根据发送消息的人将消息附加到相应的DOM元素,当用户断开连接时,您必须删除userSocket上的socket.id,等等。

我希望它有所帮助!