Socket.IO客户端在返回时接收离线消息

时间:2014-10-30 04:19:38

标签: javascript node.js sockets offline

环境:

+的NodeJS Socketio

问题:

  1. 客户端A和客户端B都连接到服务器;
  2. 客户B已离线;
  3. 客户端A向客户端B发送消息(客户端B仍处于脱机状态);
  4. 客户端B再次连接到服务器;
  5. [问题]客户端B无法从A;
  6. 接收消息

    服务器代码

    var clients = {};
    io.sockets.on('connection', function (socket) {
    socket.on('online', function (data) {
        if (!clients[data.username]) {
            clients[data.username] = socket;
        }
        io.sockets.emit('message',  data.user + 'online now');
    });
    socket.on('say', function (data) {
        if (data.to == 'all') {
            io.sockets.emit('message', data.message);
        } else { //to specific client
            clients[data.to].emit('message', data.message);
        }
    });
    });
    

    描述

    客户端B首先连接到一个地方的服务器。在客户端B离线期间,客户端A向客户端B发送消息。然后客户端B再次连接到另一个地方的服务器,客户端B需要从客户端接收这些消息A.如何使它发挥作用?

3 个答案:

答案 0 :(得分:12)

如果考虑哪个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');
});

答案 1 :(得分:2)

使用像RabbitMQ这样的消息队列。每当消息来自套接字写入接收者的队列时,当接收者加入时,他将从队列中选择它。

答案 2 :(得分:0)

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

请记住,您必须在客户端发出的每次发射中发送接收者对象信息(用户名或唯一ID和套接字ID)