WebSocket Dasar
Penjelasan
WebSocket di Play memungkinkan komunikasi dua arah yang tetap terbuka antara server dan klien, cocok untuk fitur real-time seperti chat atau notifikasi live. Endpoint WebSocket didefinisikan di controller lewat `WebSocket.accept[In, Out]`, yang mengembalikan sebuah `Flow[In, Out, _]` dari Akka Streams — setiap pesan masuk dari klien mengalir lewat Flow ini dan hasilnya dikirim balik ke klien. Karena berbasis Akka Streams, semua konsep yang sudah dipelajari di Akka Streams (Source, Flow, Sink, backpressure) berlaku langsung di sini. Route untuk WebSocket didaftarkan di `conf/routes` sama seperti route HTTP biasa, tapi protokolnya otomatis di-upgrade dari HTTP ke WebSocket saat client melakukan handshake yang sesuai.
Contoh Konsep
import play.api.mvc._
import akka.stream.scaladsl.Flow
import javax.inject._
@Singleton
class EchoController @Inject()(cc: ControllerComponents) extends AbstractController(cc) {
def echo: WebSocket = WebSocket.accept[String, String] { request =>
// Flow yang mengembalikan kembali pesan yang diterima, ditambah prefix
Flow[String].map(pesan => s"Echo: $pesan")
}
}
// conf/routes
// GET /ws/echo controllers.EchoController.echo
Praktikum
Buat endpoint WebSocket bernama uppercase yang mengubah setiap pesan teks yang diterima menjadi huruf kapital sebelum dikirim balik ke klien.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Untuk kebutuhan WebSocket yang lebih kompleks (broadcast ke banyak klien, state percakapan), pertimbangkan menghubungkan Flow WebSocket ke sebuah actor Akka alih-alih hanya transformasi Flow murni.