快速可靠地更新聊天室的最佳方法?

亚历山大·汉森

我正在从事一项基本的聊天服务,它基本上是一个学校项目,将在学生中使用。我已经相当成功,但是我遇到了一个问题。更新聊天室。在我的许多测试中,接收消息并使用发送消息的用户可以识别消息的时间通常长达10秒。

都是运行php将消息推送到chatfile和jquery来加载该文件。聊天每3秒更新一次。在我的测试中,聊天文件会立即更新,但是实际聊天的更新速度却不如平均大约10秒。

我相信这一定是jquery中的一种局限性。我应该放弃jquery并找到更好的解决方案,还是我的代码有问题?任何帮助是极大的赞赏。提前致谢!

那里也有一些php,它只是加载用户名和房间名称

jQuery代码:

    var roomname = "<?php echo $_GET["room"]; ?>";
    var prevdata = "";
    update();
    setInterval(function(){update()},3000)
    $("#send").click(function(){
        sendMessage();
    });

    $('#message').keyup(function(e){
        if(e.keyCode == 13)
        {
            sendMessage();
        }
    });

    function update()
    {
        $.get("/rooms/room/"+roomname+".html",function(data){
            $("#chatbox").html(data);
            if(prevdata != data && data.indexOf("<?php echo $_SESSION["username"] ?>") != 31)
            {
            playMessageSound();
            }
            prevdata = data;
        });
    }

    function sendMessage()
    {
        var message = $("#message").val();
        $("#message").val("");
        $.get("sendmessage.php?room="+roomname+"&message="+message)
    }

    function playMessageSound()
    {
        var audio = new Audio("/sound/msg.mp3");
        audio.play();
    }

我的解决方案:我采用了jwatts的解决方案,并对其进行了一些自定义,以使其使用更少的代码行。现在,我只将聊天与文件进行比较,然后返回差异,将它们追加到聊天中,使其尽可能快地进行更新!

感谢您的帮助!

1980年代

我知道这个问题已经回答,但是我想提出另一个可能的解决方案。就这些事情而言,它是一件简单的事情,但有一些陷阱和警告,但对于一个课堂项目来说就足够了。我提出的示例不是我自己创建的示例,并且该代码未经测试。可能需要花费一些时间来实施更改并使它们生效。

但是它探索了一些基本的数据格式,例如PHP和JavaScript中的XML和JSON功能。它跟踪最新的数据抓取,并且仅获取新的聊天信息。这样,一旦数据返回浏览器,它只会加载新内容,而不是整个内容。

在上面的代码中,您似乎每次都在编写整个聊天。我确定发生了一些浏览器缓存问题。您可以请求一个返回仅包含最后一个条目的JSON数据(PHP具有内置的JSON函数)的PHP,而不是每次都请求整个html页面,然后将其追加到文档中。

有关JSON的信息很多。如果您还没有了解它,它是一种表示JavaScript固有数据的方式。它可以将JSON格式的文本本地转换为数组,对象和属性。它不像XML那样冗长。

在您的代码中,创建一个名为

var lastDataReceived = "";

这将保留上次从服务器接收到新聊天数据的时间戳。$.get()成功函数中,将URL更改为PHP页面并将其设置为获取JSON数据。另外,传递所需的信息,例如需要数据的房间的名称以及上次接收聊天数据的时间:

function update()
{
    $.get({
        url: "/rooms/room/getchatdata.php",
        data: { "room": roomname, "lastDataReceived": lastDataReceived }, 
        success: function(data){
            //..............
        },
        dataType: "json"
    });
}

这将创建一个请求

"/rooms/room/chatdata.php?room="+roomname+"&lastDataReceived="+lastDataReceived 

在服务器端,您可以像这样获取querystring参数

$roomname = $_GET["room"];
$lastDataReceived = date_create_from_format('d/M/Y H:i:s', $_GET["lastDataReceived"]);

您似乎正在将聊天信息写入HTML文件。在此示例中,最有可能使用XML数据。有很多很多的PHP XML教程。这是W3Schools.com上针对SimpleXML函数的一种。http://www.w3schools.com/php/php_ref_simplexml.asp

这样,您可以从文件加载:

$xml = simplexml_load_file($roomname.".xml");

如果它是一个新房间,也可以创建一个新的XML文件,例如:

<?php
    $chats = <<<XML
        <chats>
        </chats>
        XML;

    $xml = new SimpleXMLElement($chats);
    $xml->saveXML($roomname.".xml");
?>

要确定是读取还是写入,您可以通过检查该房间的文件是否存在来检查该房间是否存在:

$xml = NULL;
if (file_exists($roomname.".xml")) {
    //Set to exsiting
    $xml = simplexml_load_file($roomname.".xml");
} else {
    //Create new file   
    $chats = <<<XML
        <chats>
        </chats>
        XML;
    $xml = new SimpleXMLElement($chats);
    $xml->saveXML($roomname.".xml");
}

无论哪种方式,您都可以获得可以使用的$xml变量。

现在,假设您已将请求发送回服务器,以查看是否有任何新的聊天数据。您正在使用变量$roomname以及$lastDataReceived之前创建的变量并且您已经$xml从文件中加载了对象。现在,您需要查找任何新添加的内容。

$chats = $xml->chats->children();
$newchats = array();

foreach($chats as $c) {
    if ($c['date'] > $lastDataReceived) {
        array_push($newchats, $c);
    }
}

现在,您有了一个新的聊天项目数组,将JSON数据写回到浏览器中:

$json = json_encode($newchats);
header('Content-Type: application/json');
echo $json;

现在回到您的JavaScript。在上面的PHP示例中,$newchats被初始化为新数组。json_encode()上调用时,如果没有新的聊天记录,echo则将返回一个空数组。您可以在JS中对此进行测试。

在这种情况下,您将只添加传入的新项目。因此,您需要向文档中添加新的HTML。使用jQuery超级简单。说聊天都在<div>标签中:

<div id="chats">
    <!--all chats here-->
</div>

而且您有一个模板div,希望所有聊天看起来都像

<div class="chat_template" style="display:none;">
    <div class="person_name"></div>
    <div class="chat_text"></div>
    <div class="chat_time"></div>
</div>

您可以克隆它,将数据加载到其中,然后将其附加到文档中。

function update()
{
    $.get({
        url: "/rooms/room/chatdata.php",
        data: { "room": roomname, "lastDataReceived": lastDataReceived }, 
        success: function(data){
            if (data.length > 0) {
                for (var i = 0; i < data.length; i++) {[
                    var c = data[i];
                    //I do not know what the exact structure of the data will be.
                    // You may need to output the data to the console to see it's structure.
                    // But I am assuming you will have access to the date value, the person's name
                    // and the text.

                    //Clone the template and add the values
                    var div = $("div.chat_template").clone(true);
                    div.find("div.person_name").html(name);
                    div.find("div.chat_text").html(text);
                    div.find("div.chat_time").html(date_val);
                    div.show();

                    //Add the new div to the document
                    $("div#chats").append(div);

                    //Set the last received time for the next query
                    lastDataReceived = date_val;
                }

                playMessageSound();
            }
        },
        dataType: "json"
    });
}

将新的聊天信息发送到服务器时,可以data: { "chattext": text....}在jQuery$.post()函数中使用相同的类型结构您将在服务器上需要另一个PHP文件,例如addchatdata.php我已经接触过一种算法,该算法根据是否存在来获取或创建一个聊天室文件。

因此,如果您希望子XML元素看起来像这样

<chat date="04/Jun/2015 13:18:23" name="George">
    Here is some of George's text.
</chat>

获得$xml对象后,可以向其添加新的XML,如下所示:

$chat = $xml->addChild("chat", "Here is some of George's text.");
$chat->addAttribute("date", date('d/M/Y H:i:s'));
$chat->addAttribute("name", "George"); //<--Or use a variable name for the name

//Then save the changes back out to the file:
$xml->saveXML($roomname.".xml");

一般来说,这是在做您已经在做的事情:存储来自新聊天的数据,然后将该数据加载到连接到该聊天的其他客户端。但是,这里仅检索新信息,并且将在浏览器上更快地加载。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SignalR OnDisconnected-处理聊天室“用户在线”的可靠方法吗?

来自分类Dev

通过每个房间的最近聊天对聊天室进行排序的最佳方法是什么

来自分类Dev

可靠地持久保存少量数据的最佳方法?

来自分类Dev

在 Cassandra 中可靠地更新大量行的最佳实践(关系更新)

来自分类Dev

聊天室成员列表

来自分类Dev

如何最好地检索网络版 Firebase 中给定聊天室的所有评论?

来自分类Dev

如何可靠地跟踪动态更新的HTML表的底部?

来自分类Dev

如何可靠地跟踪动态更新的HTML表的底部?

来自分类Dev

AJAX,jQuery,用于聊天室的javascript

来自分类Dev

Akka Java TCP聊天室

来自分类Dev

Lync UCWA是否支持聊天室?

来自分类Dev

可靠地识别 JPG?

来自分类Dev

如何使用Quickblox聊天室进行1:1聊天?

来自分类Dev

如何快速而可靠地确定是否已安装Visual C ++ 2013 Runtime

来自分类Dev

我想快速可靠地销毁一些数据。如何?

来自分类Dev

会议室数据库加载聊天室时获取最后的聊天室消息

来自分类Dev

ASP.NET MVC 5 AJAX-本地和远程用户发布时更新聊天室

来自分类Dev

如何通过Rest API在ejabberd中创建聊天室?

来自分类Dev

nodejs聊天室对象预期第一行

来自分类Dev

Linux中C / Socket编程中的聊天室

来自分类Dev

如何使用sockjs建立私人聊天室?

来自分类Dev

如何在聊天室中添加表情符号?

来自分类Dev

支持多个虚拟聊天室(例如,使用NServiceBus)

来自分类Dev

创建聊天室应用最终以“无效的文档参考”

来自分类Dev

linphone在聊天室中使用SIP消息发送消息

来自分类Dev

在Pidgin的联系人列表中保存聊天室

来自分类Dev

无法使用asmack获得已加入的聊天室

来自分类Dev

使用API打开聊天室-Scringo Android

来自分类Dev

在ASP.net中创建聊天室

Related 相关文章

  1. 1

    SignalR OnDisconnected-处理聊天室“用户在线”的可靠方法吗?

  2. 2

    通过每个房间的最近聊天对聊天室进行排序的最佳方法是什么

  3. 3

    可靠地持久保存少量数据的最佳方法?

  4. 4

    在 Cassandra 中可靠地更新大量行的最佳实践(关系更新)

  5. 5

    聊天室成员列表

  6. 6

    如何最好地检索网络版 Firebase 中给定聊天室的所有评论?

  7. 7

    如何可靠地跟踪动态更新的HTML表的底部?

  8. 8

    如何可靠地跟踪动态更新的HTML表的底部?

  9. 9

    AJAX,jQuery,用于聊天室的javascript

  10. 10

    Akka Java TCP聊天室

  11. 11

    Lync UCWA是否支持聊天室?

  12. 12

    可靠地识别 JPG?

  13. 13

    如何使用Quickblox聊天室进行1:1聊天?

  14. 14

    如何快速而可靠地确定是否已安装Visual C ++ 2013 Runtime

  15. 15

    我想快速可靠地销毁一些数据。如何?

  16. 16

    会议室数据库加载聊天室时获取最后的聊天室消息

  17. 17

    ASP.NET MVC 5 AJAX-本地和远程用户发布时更新聊天室

  18. 18

    如何通过Rest API在ejabberd中创建聊天室?

  19. 19

    nodejs聊天室对象预期第一行

  20. 20

    Linux中C / Socket编程中的聊天室

  21. 21

    如何使用sockjs建立私人聊天室?

  22. 22

    如何在聊天室中添加表情符号?

  23. 23

    支持多个虚拟聊天室(例如,使用NServiceBus)

  24. 24

    创建聊天室应用最终以“无效的文档参考”

  25. 25

    linphone在聊天室中使用SIP消息发送消息

  26. 26

    在Pidgin的联系人列表中保存聊天室

  27. 27

    无法使用asmack获得已加入的聊天室

  28. 28

    使用API打开聊天室-Scringo Android

  29. 29

    在ASP.net中创建聊天室

热门标签

归档