- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看到 Akka 模块的描述说 Play有很好的 Comet 支持,但我从未使用过 Comet之前,我在 Play 的文档中找不到任何提及。它在 Play 中是如何工作的?
我花了两天多的时间来解决这个问题,所以我想与其他 Play 初学者分享这些信息。
最佳答案
Play 包含一个示例聊天应用程序,它演示了如何使用 Comet。这个例子并没有解释发生了什么,所以这就是我想出的。
模型
为了让其他人找到您发送的新更新,它们需要存储在某个地方。可以想象,这可能在缓存中,甚至在 Controller 本身中,但数据库将是最安全的选择,因此您需要一个模型。他们还需要一种方法来确定哪些更新对他们来说是新的,这意味着您可能需要一个日期字段(另请参见:Last update timestamp with JPA)。 Chat 示例使用一个简单的模型:
@Entity
public class Message extends Model {
public String user;
public Date date;
public String text;
public Message(String user, String text) {
this.user = user;
this.text = text;
this.date = new Date();
}
}
public static void postMessage(String message) {
new Message(session.get("nick"), message).save();
}
public static void newMessages() {
List<Message> messages = Message.find("date > ?", request.date).fetch();
if (messages.isEmpty()) {
suspend("1s");
}
renderJSON(messages);
}
suspend("1s")
这就是保持 HTTP 请求打开的原因,每秒检查一次新数据。
$('#send').click(function(e) {
var message = $('#message').val();
$('#message').val('');
$.post('@{postMessage()}', {message: message});
});
// Retrieve new messages
var getMessages = function() {
$.ajax({
url: '@{newMessages()}',
success: function(messages) {
$(messages).each(function() {
display(this);
});
},
complete: function() {
getMessages();
},
dataType: 'json'
});
}
getMessages();
getMessages()
被调用一次以开始工作,然后在每次成功请求后递归调用自身。它得到
newMessages()
查找新消息的操作,如果没有任何消息,它将保持请求打开,直到它有要报告的内容。找到新消息时,会将 JSON 数据传递给
display
功能:
var display = function(message) {
$('#thread').append(tmpl('message_tmpl', {message: message}));
}
display
函数应用
JavaScript Micro-Template到 JSON 数据以呈现新消息。不需要使用微模板,但它确实工作得很好。它们包含在将要使用它们的页面的模板中:
<script type="text/html" id="message_tmpl">
<div class="message <%= message.user == '${session.nick}' ? 'you' : '' %> <%= message.user == 'notice' ? 'notice' : '' %>">
<h2><%= message.user %></h2>
<p><%= message.text.replace('\n', '<br/>') %></p>
</div>
</script>
type="text/html"
导致浏览器、搜索引擎和屏幕阅读器忽略整个
script
堵塞。结果比使用 jQuery 构建节点或连接字符串更容易阅读和维护。总的来说,一旦您知道哪些位是相关的,它就非常简单。
关于comet - Play! 的 Comet 支持如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4511853/
我想测试它可以支持多少个连接。 我正在使用轨道,特别是流媒体,而不是长轮询。 最佳答案 Webload是你正在寻找的东西。 关于comet - 如何对 Comet 服务器进行压力测试?,我们在Stac
我看到 Akka 模块的描述说 Play有很好的 Comet 支持,但我从未使用过 Comet之前,我在 Play 的文档中找不到任何提及。它在 Play 中是如何工作的? 我花了两天多的时间来解决这
我尝试设置 comet ( https://www.comet.ml ) 来跟踪我的 Tensorflow 实验,在创建实验并记录数据集后,我在报告中无法获得准确性。 我的代码: mnist = ge
我正在尝试设置 https://www.comet.ml记录我的实验细节 出现奇怪的错误: Traceback (most recent call last): File "train.py",
我正在运行来自 Comet github project 的 keras 示例. 我添加导入并创建一个新实验: def train(x_train,y_train,x_test,y_test): mo
在 Comet/Reverse Ajax/PubSub 底层技术/基础是 Long polling。所以连接保持打开一分钟左右.. 根据我对网络和操作系统的了解,TCP/IP 仅支持 65535 个端
您与 Websync 合作的体验如何? ( cometd 框架)?在使用它之前,您是否考虑过任何替代方案? 到目前为止我可以说 优点: 非常简单易用 不需要任何服务器配置 缺点: 昂贵(结果为我们节省
我正在考虑编写一个需要能够将消息推送到浏览器的实时网络应用程序。当我第一次阅读 Comet 时,由于浏览器支持薄弱,人们似乎认为它是一种脆弱且不成熟的方法。今天,它似乎是一种既定又实用的技术。但据我所
我需要一些 linux 大师的帮助。我正在开发一个包含 cometd 服务器的网络应用程序。 Comet 服务器在 localhost:8080 上运行,并公开 url localhost:8080/
我读过一些关于这个主题的帖子,答案是 comet、反向 ajax、http 流、服务器推送等。 How does incoming mail notification on Gmail works?
我正在使用 JSONP 进行长轮询,firefox 不断弹出“正在加载”微调器,使页面看起来好像还没有完成加载。有没有办法抑制这种情况? 有人告诉我,Orbited 团队有一些技巧可以抑制这种情况,但
我有一个用 Twisted 编写的简单 cometd 服务器。它打印出时间戳。我还有一个小型静态网络服务器在同一端口上运行。所服务页面上的 JavaScript 尝试通过附加来自 Comet 服务器的
我断断续续地学习 Scala 一段时间,并成功地建立并运行了一个简单的实时发布系统。 我想知道是否有人可以帮助我在正确的方向上通过 JSON 将数据更改推送到我正在运行的几个 javascript 模
我正在尝试为 Comet 设计一个实用的客户端 (JavaScript) 实现。 http://en.wikipedia.org/wiki/Comet_(programming) ) 谈论理论,但我很
我听说我可以使用 Comet作为服务器推送技术与我的 Ajax 代码一起提高我的 Web 应用程序的性能。 这项 cometd 技术有多成熟? 是否所有网络服务器、编程语言和浏览器都支持它? 使用 C
对于一个社交网站,我们使用基于 node.js 的 Comet 服务器作为即时通讯工具,一切都运行良好,我们只有一个问题如何解决澳大利亚和新西兰的延迟问题,我们的 RRT 在 310 毫秒到 440
我一辈子都弄不明白像 Cometd 或 simple-comet 这样的应用程序的目的是什么,而不是像使用 php 的简单长轮询请求和使用这样的代码的无限循环 $time = time(); whil
这更多是出于好奇和“供将来引用”,但 Comet 是如何在数据库端实现的?我知道大多数实现使用长生命周期 HTTP 请求来“等待”直到数据可用,但这是如何在服务器端完成的? Web 服务器如何知道新数
我一直想知道使用 COMET/推送技术是否比使用长请求的更简单的轮询有真正的优势,在轮询中服务器将等待特定的最长时间以等待新事件发生,然后再告诉客户端什么都没有发生. 这两种技术都有相似的客户端延迟,
我想编写一个实时聊天应用程序,需要决定使用哪些技术。 这些技术之间有什么区别,您更喜欢哪一种,为什么? WebSockets 不是一种选择,因为它还没有准备好在野外战斗 谢谢 最佳答案 您应该阅读问题
我是一名优秀的程序员,十分优秀!