Kotlin Ktor WebSocket 사용하기
04 Jan 2020 | Kotlin ktorKtor WebSocket 사용하기
WebSocket
를 이용하면 실시간 양방향 통신을 할 수 있습니다.
build.gradle
먼저 build.gradle
에 다음 라이브러리를 추가해줍니다.
dependencies { implementation "io.ktor:ktor-websockets:$ktor_version" }
Main.kt
routing
은 다음 코드처럼 할 수 있으며, incoming.receive()
메소드와 outgoing.send(Frame.Text(text)
메소드는 블럭킹(Blocking) 메소드입니다.
package com.snowdeer import io.ktor.application.Application import io.ktor.application.install import io.ktor.http.cio.websocket.Frame import io.ktor.http.cio.websocket.readText import io.ktor.http.content.resources import io.ktor.http.content.static import io.ktor.routing.routing import io.ktor.websocket.WebSockets import io.ktor.websocket.webSocket import java.time.Duration fun Application.main() { install(WebSockets) { pingPeriod = Duration.ofSeconds(60) // Disabled (null) by default timeout = Duration.ofSeconds(15) maxFrameSize = Long.MAX_VALUE // Disabled (max value). The connection will be closed if surpassed this length. masking = false } routing { static("/static") { resources("static") } webSocket("/chat") { println("[snowdeer] chat starts") while (true) { when (val frame = incoming.receive()) { is Frame.Text -> { val text = frame.readText() println("[snowdeer] text: $text") outgoing.send(Frame.Text("$text from Server")) } } } println("[snowdeer] chat is finished") } } }
client.html
다음 코드를 브라우저에서 실행해서 WebSocket 통신이 잘 되는지 확인할 수 있습니다.
<!DOCTYPE HTML> <html> <head> <script type = "text/javascript"> function startWebSocket() { if ("WebSocket" in window) { alert("You can use WebSocket."); var ws = new WebSocket("ws://localhost:8080/chat"); ws.onopen = function() { alert("WebSocket is opened."); ws.send("Hello"); alert("Send message to Server(Hello)."); }; ws.onmessage = function (evt) { var msg = evt.data; alert("Message is received(" + msg + ")"); }; ws.onclose = function() { alert("WebSocket is closed."); }; } else { alert("Your browser does not support WebSocket !!!"); } } </script> </head> <body> <a href = "javascript:startWebSocket()">Start WebSocket</a> </body> </html>