§Comet
§使用分塊回應與 Comet
分塊回應的常見用途是建立 Comet Socket。
Comet Socket 是分塊的 text/html
回應,其中只包含 <script>
元素。對於每個區塊,我們會撰寫一個包含 JavaScript 的 <script>
標籤,而這個 JavaScript 會立即由網路瀏覽器執行。這樣一來,我們就可以從伺服器向網路瀏覽器傳送即時事件:對於每則訊息,將其包裝到一個呼叫 JavaScript 回呼函式的 <script>
標籤中,並將其寫入分塊回應。
因為 ok().chunked
利用 Pekko Streams 來取得 Flow<ByteString>
,我們可以傳送元素的 Flow
並轉換它,讓每個元素都經過跳脫處理並包裝在 Javascript 方法中。Comet 輔助程式會自動化 Comet socket,推播一個初始空白緩衝資料以符合瀏覽器相容性,並支援字串和 JSON 訊息。
§Comet 匯入
若要使用 Comet 輔助程式,請匯入下列類別
import org.apache.pekko.NotUsed;
import org.apache.pekko.stream.javadsl.Source;
import play.core.j.JavaHandlerComponents;
import play.libs.Comet;
import play.libs.Json;
import play.mvc.Http;
import play.mvc.Result;
您還需要一個具象化器,最好的方式是從 DI 系統 中提取 pekko.stream.Materializer
。
§將 Comet 與字串 Flow 搭配使用
若要透過 Flow 推播字串訊息,請執行下列動作
public static Result index() {
final Source<String, NotUsed> source = Source.from(Arrays.asList("kiki", "foo", "bar"));
return ok().chunked(source.via(Comet.string("parent.cometMessage"))).as(Http.MimeTypes.HTML);
}
§將 Comet 與 JSON Flow 搭配使用
若要透過 Flow 推播 JSON 訊息,請執行下列動作
public static Result index() {
final ObjectNode objectNode = Json.newObject();
objectNode.put("foo", "bar");
final Source<JsonNode, NotUsed> source = Source.from(Collections.singletonList(objectNode));
return ok().chunked(source.via(Comet.json("parent.cometMessage"))).as(Http.MimeTypes.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()
操作,以顯示串流中資料對應時所涉及的任何錯誤。
§舊版 Comet 功能
現有的 Comet 功能仍可透過 play.libs.Comet
取得,但已標示為不建議使用,建議您改用基於 Pekko Streams 的版本。
由於 Java Comet 輔助程式是以回呼為基礎,因此將基於回呼的功能直接轉換成 org.reactivestreams.Publisher
並使用 Source.fromPublisher
來建立來源會比較容易。
下一步:WebSockets
在此文件檔中發現錯誤?此頁面的原始碼可在此處找到這裡。閱讀文件檔指南後,請隨時提交拉取請求。有問題或建議要分享嗎?前往我們的社群論壇與社群展開對話。