Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Node.js处理多个聊天会话

如何使用Node.js处理多个聊天会话
EN

Stack Overflow用户
提问于 2011-07-04 05:22:58
回答 3查看 1.8K关注 0票数 2

我目前正在开发一个使用Node.js的聊天系统。我的问题是,如何使用Node.js处理多个聊天会话。有点含糊,所以我会解释的..。

因此,例如,两个人可能参与聊天会话。Node.js每隔几秒钟检查一次新消息。这很简单,因为我可以使用下面的代码让它工作得很好。

我的问题是当另外两个人同时在另一个聊天会话中时。

目前,我发送了两个名为"chat_id“和"check_date”的查询字符串,这样它就可以在某个日期和时间之后检查新的聊天消息。

问题是,每次开始新的聊天时,"chat_id“和"check_date”都会被覆盖,因为这两个聊天室都在使用服务器。

我说的有道理吗?

我的代码如下:

代码语言:javascript
运行
AI代码解释
复制
var chat_id, check_date;

var sys = require("sys"),  
    http = require("http"),  
    url = require("url"),  
    path = require("path"),  
    fs = require("fs"),  
    events = require("events");  

// Conntect to database
var Client = require('mysql').Client;
var client = new Client();
client.host = 'localhost';
client.port = 3306;
client.database = '****';
client.user = '****';
client.password = '****';
client.connect(function(error, results) {
  if(error) {
    console.log('Connection Error: ' + error.message);
    return;
  }
  console.log('Connected to MySQL');
});

// Check for chat updates
function getChatUpdates() {  

    if (typeof(check_date) == 'undefined')
        return;

    client.query('SELECT name, message FROM chat WHERE chat_id = "' + chat_id + '" AND date_entered > "' + check_date + '"', 
    function selectCb(error, results, fields) {
        if (error) {
            console.log('GetData Error: ' + error.message);
            client.end();
            return;
        }

        if (results.length > 0) {
            for(var i = 0;i<results.length;i++) {
                console.log('Name: ' + results[i]['name']);
                console.log('Message: ' + results[i]['message']);
            }
        }

  });

}  

// Set interval to check for chat updates every 2 seconds
setInterval(getChatUpdates, 2000);  

http.createServer(function(request, response) {  

    // Get the query strings
    var uri = url.parse(request.url, true);  
    chat_id = uri.query.chat_id;
    check_date = uri.query.check_date;
    console.log('Chat ID: ' + chat_id);
    console.log('Last Check: ' + check_date);

    // we'll do something here later.

}).listen(8080);  

sys.puts("Server running at http://localhost:8080/");
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-04 09:33:36

看起来你有PHP的背景,当你用node.js编程时,你应该有一个完全不同的心态。不应轮询(setInterval(getChatUpdates, 2000);

),但在事件时向用户推送(回调/事件)消息。我建议您研究一下socket.io,并使用内存中的数据库,如redis(而不是mysql)来存储消息。当你像这样编写代码时,你的站点将会表现得更好,并且将是实时的(更多)。此外,我建议您使用express作为开发网站的框架,而不是使用原始的http模块。我不知道您是否已经了解npm,但您应该使用它来管理您的依赖项。

票数 7
EN

Stack Overflow用户

发布于 2011-07-04 08:43:48

var chat_id,check_date;

是全局变量。您将覆盖每个连接上的chat_id (在createServer中。你可能需要一些会话存储(来关联一个用户和他们的聊天),例如。数组、Redis等。

票数 4
EN

Stack Overflow用户

发布于 2011-07-04 08:03:36

看起来您正在尝试使用MySQL作为消息队列。RabbitMQ

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6567572

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档