Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.IO客户端在返回时接收脱机消息 环境:_Javascript_Node.js_Sockets_Offline - Fatal编程技术网

Javascript Socket.IO客户端在返回时接收脱机消息 环境:

Javascript Socket.IO客户端在返回时接收脱机消息 环境:,javascript,node.js,sockets,offline,Javascript,Node.js,Sockets,Offline,Nodejs+Socketio 问题: 客户端A和客户端B都连接到服务器 客户端B离线 客户端A向客户端B发送消息(客户端B仍处于脱机状态) 客户端B再次连接到服务器 [问题]客户端B无法接收来自A的消息 服务器代码 描述 客户端B首先在一个位置连接到服务器。在客户端B脱机期间,客户端A向客户端B发送消息。然后客户端B再次连接到另一个位置的服务器,客户端B需要从客户端接收这些消息。如何使它工作?< /P> < P>如果要考虑哪一个DB和它的配置,以及客户端,我必须编写的代码量会相当大,以便创建一

Nodejs+Socketio

问题:
  • 客户端A和客户端B都连接到服务器
  • 客户端B离线
  • 客户端A向客户端B发送消息(客户端B仍处于脱机状态)
  • 客户端B再次连接到服务器
  • [问题]客户端B无法接收来自A的消息 服务器代码 描述
    客户端B首先在一个位置连接到服务器。在客户端B脱机期间,客户端A向客户端B发送消息。然后客户端B再次连接到另一个位置的服务器,客户端B需要从客户端接收这些消息。如何使它工作?< /P> < P>如果要考虑哪一个DB和它的配置,以及客户端,我必须编写的代码量会相当大,以便创建一个解决方案。基本上,您必须将消息持久保存在数据库中。当消息传入时,您必须写入您的对话对象(或代表客户端之间聊天消息的任何对象)

    然后,当客户端加入时,您必须从数据库获取所有消息

    socket.on('online', function (data) {
        if (!clients[data.username]) {
            clients[data.username] = socket;
        }
        // pseudo code to get messages and display to user on first load
        // var conversation = db.getConversation();
        // var messages = conversation.getLast10Messages();
        // messages.forEach(function(message) { 
        //     clients[data.username].emit('message', message);
        // });
        io.sockets.emit('message',  data.user + 'online now');
    });
    

    使用类似RabbitMQ的消息队列。每当消息从套接字写入接收方队列,并且接收方加入时,他将从队列中拾取消息。

    您可以为每个用户指定一个唯一的id作为用户名,将其保存在服务器端,或者使用用户名,您还有客户机id(套接字id),然后将其保存在对象中,现在为每个用户指定一个包含(用户名或唯一id)和套接字id,现在在用户脱机时可以轻松保存消息,然后将其发送给用户。 在发出每个事件之前,您可以在套接字的已连接套接字对象中搜索套接字id。如果套接字id存在,则可以发出,否则,您仍然具有用户名,并且可以按用户名在数据库中保存消息


    请记住,您必须发送接收方对象信息(用户名或唯一id,以及套接字id)在每次从客户端发出的消息中

    IMO都无法仅使用套接字来实现这一点,为此,您必须检查客户端B的状态,并将脱机消息保存到DB或某个套接字变量,然后在OnlineHank获取您的评论时将其推回客户端B,您知道如何检查客户端B的状态吗?我如何知道客户端B是联机还是脱机?从
    socket.on('disconnect',function(){})
    请发布您的客户端代码。谢谢Shawn,Ravi认为应该有DB来存储与特定客户端对应的脱机消息是正确的。它不适用于订阅一个主题的多个客户端,因为消息将为第一个客户端排队,而脱机客户端的其余部分将不会收到任何消息。这是一个很好的回答。关于另一个主题,我还有一个额外的问题。我应该先将每条消息保存在数据库中(用于保存消息历史记录),然后将消息发送给相应的用户,还是使用任何代理来降低发送时间?在传统的消息应用程序中,我不知道使用的是哪个流。
    socket.on('say', function (data) {
        // pseudo code to save conversation
        // var conversation = db.getConversation();
        // conversation.addMessage(data.message);
        // conversation.save();
        if (data.to == 'all') {
            io.sockets.emit('message', data.message);
        } else { //to specific client
            clients[data.to].emit('message', data.message);
        }
    });
    
    socket.on('online', function (data) {
        if (!clients[data.username]) {
            clients[data.username] = socket;
        }
        // pseudo code to get messages and display to user on first load
        // var conversation = db.getConversation();
        // var messages = conversation.getLast10Messages();
        // messages.forEach(function(message) { 
        //     clients[data.username].emit('message', message);
        // });
        io.sockets.emit('message',  data.user + 'online now');
    });