2014-02-28 52 views
0

我已经做了几个使用节点JS & socket.io项目..节点+ socket.io聊天服务器..我可以错过一些消息吗?

在我的最后一个项目,这是建立一个聊天室一样的功能,我下面的事情。

  1. 我渲染了一个空白框,在那里显示聊天消息。

  2. 然后我连接到socket.io服务器。

  3. 当连接请求发送到服务器时,我也会将该聊天室的所有旧聊天消息推送到浏览器。

  4. 在聊天会话过程中,如果有任何用户一致地断开连接(网络故障),则在重新连接后,所有旧的聊天消息将被取回&覆盖前面的消息。

现在,我想,是否有可能会遗漏显示一些聊天消息。到目前为止,我还没有看到过这种情况。

我在想什么,如果一个人只是在创建一个连接时发送一条消息会发生什么。是否有可能创建的新连接不会收到消息?

对不起,如果这听起来像一个基本问题,我无法解决这个问题!

回答

1

我当时的想法是,如果消息被某人只是在交付会发生什么创建一个连接。是否有可能创建的新连接不会收到消息?

最终,我不这么认为。节点是一个单线程服务器。这两个事件将以一个简单的顺序执行。至少在功能级别上,您的应用程序代码绝不会以交错的方式运行,它将同时处理新连接和新消息。

你的各种回调可能当然是相互交错,所以你必须对此进行推理。但是一旦你进入了一个函数,它就会运行到完成,而你的代码中的任何其他部分都不会修改任何数据。

+0

谢谢..这正是我的想法..但我很想看看别人有什么要说的! :) – Manu

0

我认为我们可以猜测你可以创建一个包含最后10或20个帖子的数组,并且当你再次连接它时发送。如果连接重置正常是重新加载页面,并且您不能删除默认并包含最后20个帖子,或者您想保存!

+0

我不明白你的意思吗?你能详细点吗? – Manu

0

Server.js

var nicknames = [] 
var old_messages = [] 

io.sockets.on('connection',function(socket){ 


socket.on('nickname',function(data, callback){ 

    if (nicknames.indexOf(data) != -1){ 
     callback(false); 
    }else{ 
     callback(true); 
     nicknames.push(data); 
     socket.nickname = data; 
     io.sockets.emit('nicknames', nicknames); 

     //------------ send the old messages------------- 
        io.sockets.emit('old_messages', old_messages); 


    } 
}); 

socket.on('user message',function (data){ 

     // ------------ Update de old_message list -------------- 
      old_messages.push(socket.nickname + " - " +data); 
      if (old_messages.length > 10) 
      {var aux = old_messages.pop()} 


    io.sockets.emit('user message', { 
     nick: socket.nickname, 
     message: data 
    }); 
}); 

socket.on('disconnect', function(){ 
    if (!socket.nickname) return; 
    if (nicknames.indexOf(socket.nickname) > -1){ 
    nicknames.splice(nicknames.indexOf(socket.nickname),1); 
    } 
    io.sockets.emit('nicknames', nicknames); 
}); 
}); 

Client.js

var socket = io.connect(); 
jQuery(function ($) { 
var sendMessage= $('#send-message'); 
var nickName = $('#nickname'); 
var setNicknameForm = $('#set-nickname'); 
var firstTime = true; 

setNicknameForm.submit(function(event){ 
    event.preventDefault(); 
    socket.emit('nickname',nickName.val(),function(data){ 
     if (
      setNicknameForm.hide(); 
      sendMessage.show(); 
     } else { 
      setNicknameForm.prepend('<p> Ya esta cogido </p>'); 
     } 
    // Uptade messages 
    socket.on ('old_messages', function(data){ 
     if (firstTime){ 
      for (var i=1; i<data.length(); i++){ 
       $('#messages').append($('<p>').text(data[i])); 
      }; 
          firsTime = false; 
     }; 

    }); 

    socket.on('nicknames',function(data){ 
     $('#nicknames').empty().append($('<ul>')); 
     for(var i=0; i<data.length; i++) { 
      $('#nicknames ul').append('<li>' + data[i]); 
     } 
    }); 

    }); 
}); 

sendMessage.submit(function(event){ 
    event.preventDefault(); 
    socket.emit('user message',$('#message').val()); 
    $('#message').val(''); 

}); 

socket.on('user message',function(data){ 
    $('#messages').append($('<p>').text(data.nick+" - "+data.message)); 
}); 
+0

我还没有要求任何代码! :/ – Manu

1

消息在服务器端完全发送,但没有传送到客户端可能会发生,如果连接丢失,而消息正在飞行。这应该是一个非常低频率的事件,但这是可能的。

为了排除问题,为什么不引入类似递增的消息ID?

在重新连接时,客户端会发送之前收到的最后一条聊天消息的ID,并且服务器会发送任何后续消息。

+0

是的..我也可以这样做..现在,连接/重新连接我发送所有的消息..可以避免...有没有机会在这种情况下跳过消息? – Manu

+0

看不出有什么东西可以丢失在那里。最后的消息ID是客户端接收到的统计信息,并且未连接到服务器记录为已发送的内容。 – gzost

+0

我的观点是,如果消息在重新连接发生的同时到达,会发生什么......我希望在这种情况下不会丢失一些消息。请参阅Jason Reid的答案.. :) – Manu

相关问题