- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在做一个基本的聊天服务,这基本上是一个学校项目,它将用于学生之间。我很成功,但我有一个问题。更新聊天室。在我的许多测试中,它倾向于使用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();
}
最佳答案
我知道这个问题已经得到了回答,但我想提出另一个可能的解决办法。就这些事情而言,这是一个简单的问题,有一些问题和注意事项,但对于类项目来说,这就足够了。我建议的示例不是我自己创建的,代码是未经测试的。你可能需要一点时间来实现这些改变并让它们工作。
但是它探索了一些基本的数据格式,比如php和javascript中的xml和json功能。它跟踪最新的数据抓取,只获取新的聊天信息。这样,一旦数据返回浏览器,它只加载新的内容,而不是整个内容。
在上面的代码中,每次看起来你都在编写整个聊天。我确信浏览器缓存有问题。不要每次都请求整个html页面,您可以请求一个返回json数据(php有内置的json函数)的php,它只包含最后的条目,然后将这些条目追加到文档中。
关于json有很多可用的信息。如果您还没有了解它,那么它是一种表示javascript本机数据的方式。它可以将json格式的文本本机转换为数组、对象和属性。它不像xml那样冗长。
在代码中,创建一个名为
var lastDataReceived = "";
$.get()
success函数中,将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
$roomname = $_GET["room"];
$lastDataReceived = date_create_from_format('d/M/Y H:i:s', $_GET["lastDataReceived"]);
$xml = simplexml_load_file($roomname.".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_encode($newchats);
header('Content-Type: application/json');
echo $json;
$newchats
被初始化为一个新数组。当对其调用
json_encode()
时,如果没有新的聊天记录,
echo
将返回一个空数组。你可以在js中测试这个。
<div>
标签中:
<div id="chats">
<!--all chats here-->
</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"
});
}
div
函数中使用相同的
data: { "chattext": text....}
类型结构。在服务器上需要一个不同的php文件,比如
$.post()
。我已经提到了一个算法,它基于是否存在聊天室文件来创建或创建聊天室文件。
<chat date="04/Jun/2015 13:18:23" name="George">
Here is some of George's text.
</chat>
addchatdata.php
对象,就可以向其添加新的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");
关于php - 快速可靠地更新聊天室的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30649058/
我有聊天应用程序,可以一对一发送消息(fromId/toId)。我想升级它的聊天室。我怎样才能做到这一点? ChatingRoom 需要什么数据库结构?我还需要做什么? 我的 User.swift 模
本文实例讲述了python socket多线程通讯方法。分享给大家供大家参考,具体如下: ?
我正在使用简单的套接字连接创建一个聊天室。我有一个服务器和客户端程序。服务器在端口 225 上运行,然后当我在端口 225 上运行客户端以便它们可以读/写套接字时,客户端立即停止并显示错误消息 jav
我可以创建一个粘液室。但是如果我将房间名称指定为数据库中现有的房间名称,服务器会拒绝它。那么是否可以在 ejabberd 服务器(MYSQl 后端)中创建两个具有相同名称的房间? 如果可能的话,后果是
我正在尝试使用 PHP 创建一个聊天室(顺便说一句,它正在工作),但只显示消息,而不显示他们的用户名。我已经为他们创建了数据库、用户名和消息。我不知道为什么他们的用户名没有显示 ".$extract[
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我想在我的应用程序中实现群聊,为此我正在使用 MUC 聊天室来实现它。 在这里,我想向房间添加一个成员列表(我有 JID)。我想在内部将它们添加到列表中的所有成员。我如何在不邀请他们的情况下添加他们。
我正在尝试在 Rails 中创建类似 Whatsapp 的消息应用程序服务器端,并进行私有(private)对话。现在,我正在尝试实现应用程序的实时部分 - 我正在使用 websocket-rails
我正在尝试为我的网站制作一个 PHP/JavaScript 聊天系统。如何在不刷新页面的情况下做到这一点? JavaScript 可以:--动态添加文本到文本框。 PHP 可以:--将聊天内容保存到聊
我已经为多个客户端完全开发了一个聊天室,其多线程服务器可以完成这项工作,但仅限于我的本地计算机。我想超越这个,让这个聊天室通过互联网工作。到目前为止,我已经在路由器上对 TCP 协议(protocol
我是 Angular 的初学者,我正在尝试构建一个聊天室应用程序,以此自学如何在该框架中进行开发。 我在后端使用 PHP 和 Yii 将 RESTful 数据发送回 Angular 应用程序。我知道我
我正在寻找好的建议来制作这个聊天室: 使用 Java Swing。我已经尝试了所有 java swing 组件 3 天,但我仍然不知道该选择什么。 容器还必须插入 JprogressBars 以进行文
嗨,我正在努力让两件事同时工作...... channels2 chat room例子可以开始,但我想添加一个功能,知道房间里有多少人。我通过更新房间模型来做到这一点。 然后我想要一个仪表板来显示当前
我正在编写一个需要持久存储对话的多聊天室应用程序(即新用户应该能够看到旧消息)。如果有帮助,我正在使用 socket.io。 目前,当用户登录到一个房间时,我的 Node 应用程序会检查是否有人去过那
我试图扩展doc中关于TCP的代码来制作一个简单的聊天室,简单地说,几个客户端连接到服务器,一个客户端发送一个字符串,服务器将字符串广播给所有客户端......我写的代码显示下面,它不起作用,有人可以
如何在 Microsoft-Teams 中自动向聊天室发布消息?这是用于单向消息传递:即发布消息,而不是阅读消息。 这里的大局是我们正在评估不同的群聊解决方案,其中一项要求是从各种服务和程序向聊天室发
我创建了一个小型的 jquery 和 php 聊天室,其中包含一些 .get 和 .post 函数以及用于将数据读写到 sql server 的 php 文档。它工作正常,但小问题是当有人发布一些东西
我想实现的是自动下载附件功能,无需进入 ChatRoom,使用 QuickBlox SDK iOS 版本 2.0.12, 为此,我想在登录后启动用户所属的所有对话框(聊天室)。 使用当前的 API,用
所以我有聊天室工作所以如果收件人是 All 或 ALL 它广播我有这个工作所以如果你的名字是'Sam'它发送它与“私有(private)消息:”文本我不知道如何检查用户名的花名册并将其私下发送给该用户
我正在尝试创建基于移动设备的聊天应用。 基本上,我希望用户使用他们的 Facebook 帐户连接到 Facebook(使用 XMPPFramework) 我想要预先存在的房间供用户加入。我注意到 XM
我是一名优秀的程序员,十分优秀!