使用带有redis的节点和套接字将数据从c#app推送到Web界面

时间:2012-12-11 20:21:43

标签: node.js express redis socket.io

我正在尝试开发我的第一个节点应用程序..那就是说我有一个C#应用程序通过POST将用户特定的json数据提交给url让我们称之为//localhost/data/send,这个数据将每隔~1发送一次-5秒(还没决定)。

然后我将有一个网站,要求用户登录,然后轮询该用户数据并显示它。我现在不是每隔x秒刷新一次页面,而是认为我可以使用某种套接字或基于事件的技术,如socket.io或redis pub / sub,将数据推送到连接的客户端。

但是接下来,我该如何确保两件事:

  1. 仅限已连接的用户访问其信息
    1. 我目前正在使用快递,但那确实是开放的......
  2. 只有在用户登录远程Web界面时才会发送数据
  3. 我的思维过程是,当用户登录桌面c#app时,它开始轮询以检查用户是否/何时登录到Web界面。

    用户登录Web界面后,桌面应用会根据桌面应用和Web应用之间匹配的用户名识别会话ID。然后它开始仅推送到该会话ID。

    这需要redis吗?或者我可以使用一个简单的mysql表和socket.io?

    一旦用户注销,数据就不需要持久。

1 个答案:

答案 0 :(得分:1)

如果数据不需要保留,并且这是一个用户很少的内部简单应用程序,那么我会创建一个模块,其中包含一个队列和方法来添加和删除队列中的项目。

每个登录用户的模块都有一个队列。当用户离开页面(onunload)时,您将其注销并删除该用户的队列。当您调用c#app调用添加事件时,队列将不存在,这意味着用户未登录。当用户登录时,您将为该用户创建队列。

请参阅此处了解如何在快递中执行身份验证。 How to do authentication with Node.js, Express and Mongoose?

这样的事情:

var queue = {};

exports.queueEvent = function(user, event){
  if(queue[user]){
    queue[userid].push(event);
  }
  else{
    return 'user not logged in, come back later';
  }
};

exports.getEvent = function(user){
  if(!queue[user]){
    queue[user] = [];  // this indicates the user is logged in.
    return null; // no events yet.
  }
  return queue[user.shift();
}

exports.logOutUser = function(user){
  if(queue[user]){
    delete queue[user];
  }
}