Node + socket.io聊天服务器..我能错过一些消息吗?

时间:2014-02-28 19:06:12

标签: javascript node.js websocket socket.io

我使用Node JS& amp;做了几个项目。 socket.io ..

在我上一个建立聊天室功能的项目中,我做了以下事情。

  1. 我渲染了一个空白框,其中显示了聊天消息。

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

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

  4. 在聊天会话的中间,如果任何用户同时断开连接(网络故障),则在重新连接时将获取所有旧聊天消息&覆盖了之前的消息。

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

    我在想的是,如果某人只是在创建连接时传递了一条消息,会发生什么。创建的新连接是否有可能无法收到消息?

    请原谅我,如果这听起来像一个基本问题,我无法通过这个问题来思考!

4 个答案:

答案 0 :(得分:3)

如果在消息传输过程中连接丢失,则可能会发生完全在服务器端发送但未传送到客户端的消息。这应该是一个非常低频的事件,但它是可能的。

要排除问题,为什么不引入增量消息ID等内容?

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

答案 1 :(得分:1)

  

我在想的是,如果某人只是在创建连接时传递了一条消息,会发生什么。创建的新连接是否有可能无法收到消息?

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

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

答案 2 :(得分:0)

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

答案 3 :(得分: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));
});