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

环境:

+的NodeJS Socketio

问题:

  1. 客户端A和客户端B都连接到服务器;
  2. 客户端B离线;
  3. 客户端A向客户端B发送消息(客户端B仍然离线);
  4. 客户端B再次连接到服务器;
  5. [ 问题 ]客户端B无法接收来自A的消息;

服务器代码

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接收消息。使其工作? 这是我的第一个问题,我急切地期待你的任何build议。提前感谢。

如果我考虑哪个数据库以及它的configuration和客户端,我将不得不编写的代码量相当大。 你基本上必须坚持你的消息在数据库中。 当消息进来时,你必须写信给你的对话对象(或者任何代表客户端之间的聊天消息)。

 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); } }); 

然后,当客户端join时,您将不得不从数据库中获取所有消息。

 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的消息队列。 每当一个消息来自套接字写入接收者的队列,当接收者join时,他会从队列中select它。