Javascript 节点+;socket.io聊天服务器。。我能错过一些留言吗?

Javascript 节点+;socket.io聊天服务器。。我能错过一些留言吗?,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我已经使用Node JS和socket.io完成了几个项目 在我的上一个项目中,即构建一个类似聊天室的功能,我做了以下事情 我呈现了一个空白框,其中显示聊天信息 然后我连接到socket.io服务器 当连接请求转到服务器时,我还将该聊天室的所有旧聊天信息推送到浏览器 在聊天会话期间,如果任何用户同时断开连接(网络故障),则在重新连接时,所有旧聊天信息都将被提取并覆盖在以前的信息上 现在,我想问,我是否有可能错过显示一些聊天信息。到目前为止,我还没有看到这种情况发生 我想的是,如果一条消息在创建连

我已经使用Node JS和socket.io完成了几个项目

在我的上一个项目中,即构建一个类似聊天室的功能,我做了以下事情

  • 我呈现了一个空白框,其中显示聊天信息

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

  • 当连接请求转到服务器时,我还将该聊天室的所有旧聊天信息推送到浏览器

  • 在聊天会话期间,如果任何用户同时断开连接(网络故障),则在重新连接时,所有旧聊天信息都将被提取并覆盖在以前的信息上

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

    我想的是,如果一条消息在创建连接的同时被某人传递,会发生什么。是否有可能创建的新连接无法获取消息


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

    我想我们可以猜到,你可以用最后10或20条帖子创建一个数组[messages],当你再次连接它发送时。如果连接重置正常是重新加载页面,如果您无法删除默认设置并包含最后20篇文章,或者您希望保存

    我想我们可以猜到,你可以用最后10或20条帖子创建一个数组[messages],当你再次连接它发送时。如果连接重置正常是重新加载页面,如果您无法删除默认设置并包含最后20篇文章,或者您希望保存

    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);
    });
    }); 
    
     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));
    });
    
    Client.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);
    });
    }); 
    
     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));
    });
    
    var socket=io.connect();
    jQuery(函数($){
    var sendMessage=$(“#发送消息”);
    变量昵称=$(“#昵称”);
    var set昵称形式=$(“#set昵称”);
    var firstTime=true;
    setNicknickForm.submit(函数(事件){
    event.preventDefault();
    socket.emit('昵称',昵称.val(),函数(数据){
    如果(
    setNicknickForm.hide();
    sendMessage.show();
    }否则{
    setnickniform.prepend(“Ya esta cogido

    ”); } //向上的信息 socket.on('old_messages',函数(数据){ 如果(第一次){
    对于(var i=1;iServer.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);
    });
    }); 
    
     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));
    });
    
    Client.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);
    });
    }); 
    
     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));
    });
    
    var socket=io.connect();
    jQuery(函数($){
    var sendMessage=$(“#发送消息”);
    变量昵称=$(“#昵称”);
    var set昵称形式=$(“#set昵称”);
    var firstTime=true;
    setNicknickForm.submit(函数(事件){
    event.preventDefault();
    socket.emit('昵称',昵称.val(),函数(数据){
    如果(
    setNicknickForm.hide();
    sendMessage.show();
    }否则{
    setnickniform.prepend(“Ya esta cogido

    ”); } //向上的信息 socket.on('old_messages',函数(数据){ 如果(第一次){ 对于(var i=1;i 我在想的是,如果一条消息在创建连接的时候被某人发送,会发生什么情况。是否有可能创建的新连接不会收到该消息

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

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

    我在想的是,如果一条消息在创建连接的时候被某人发送,会发生什么情况。是否有可能创建的新连接不会收到该消息

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


    当然,您的各种回调可能会相互交错,因此您必须对此进行分析。但是,一旦进入函数内部,它将一直运行到完成,而您的任何数据都不会被代码的任何其他部分修改。

    一条消息完全在服务器端发送,但没有发送到客户端,这可能会导致错误如果消息在传输过程中连接丢失,则报警。这应该是一个频率非常低的事件,但也有可能

    为了排除这个问题,为什么不引入像递增消息ID这样的东西呢


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

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

    为了排除这个问题,为什么不引入像递增消息ID这样的东西呢


    在重新连接时,客户端会发送上次收到的聊天信息的ID,服务器会发送任何后续信息。

    我不明白你的意思。你能详细说明吗?我不明白你的意思。你能详细说明吗?谢谢。这正是我所想的。我仍然很想看看其他人都说了些什么!:)谢谢..这正是我所想的..我仍然很想看看其他人都说了些什么!:)是的..我也可以这样做..现在,在连接/重新连接时,我正在发送所有的消息..这是可以避免的..在这种情况下是否有可能跳过消息