§Comet
§使用分块响应与 Comet
分块响应 的一个常见用途是创建 Comet 套接字。
Comet 套接字是一个分块的 text/html
响应,其中只包含 <script>
元素。对于每个块,我们写入一个包含立即由 Web 浏览器执行的 JavaScript 的 <script>
标签。这样,我们就可以从服务器将事件实时发送到 Web 浏览器:对于每条消息,将其包装在一个调用 JavaScript 回调函数的 <script>
标签中,并将其写入分块响应。
由于 Ok.chunked
利用 Pekko 流 来获取 Flow[ByteString]
,因此我们可以发送一个元素流并对其进行转换,以便每个元素都经过转义并包装在 Javascript 方法中。Comet 助手自动执行 Comet 套接字,为浏览器兼容性推送初始空白缓冲区数据,并支持字符串和 JSON 消息。
§Comet 导入
要使用 Comet 助手,请导入以下类
import org.apache.pekko.stream.scaladsl.Source
import org.apache.pekko.stream.Materializer
import play.api.http.ContentTypes
import play.api.libs.json._
import play.api.libs.Comet
import play.api.mvc._
您还需要一个物化器,最好从您的 DI 系统 中提取 pekko.stream.Materializer
。
§使用 Comet 与字符串流
要通过 Flow 推送字符串消息,请执行以下操作
def cometString = Action {
implicit val m = materializer
def stringSource: Source[String, _] = Source(List("kiki", "foo", "bar"))
Ok.chunked(stringSource.via(Comet.string("parent.cometMessage"))).as(ContentTypes.HTML)
}
§使用 Comet 与 JSON 流
要通过 Flow 推送 JSON 消息,请执行以下操作
def cometJson = Action {
implicit val m = materializer
def jsonSource: Source[JsValue, _] = Source(List(JsString("jsonString")))
Ok.chunked(jsonSource.via(Comet.json("parent.cometMessage"))).as(ContentTypes.HTML)
}
§使用 Comet 与 iframe
Comet 助手通常应与 forever-iframe
技术一起使用,使用类似于以下的 HTML 页面
<script type="text/javascript">
var cometMessage = function(event) {
console.log('Received event: ' + event)
}
</script>
<iframe src="/comet"></iframe>
注意:将以下配置添加到您的 application.conf 文件中,并确保您已设置路由映射,以便看到上述 Comet 的实际效果。
play.filters.headers { frameOptions = "SAMEORIGIN" contentSecurityPolicy = "connect-src 'self'" }
有关 Comet 助手示例,请参阅 Play 流式传输示例。
§调试 Comet
调试无法正常工作的 Comet 流的最简单方法是使用 log()
操作来显示与通过流映射数据相关的任何错误。
下一步:WebSockets
发现此文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区开始对话。