文档

§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


发现此文档中的错误?此页面的源代码可以在 此处 找到。阅读完 文档指南 后,请随时贡献拉取请求。有疑问或建议要分享?前往 我们的社区论坛 与社区开始对话。