From d11ed0b886eac05f713ac781e5ddd26706866dee Mon Sep 17 00:00:00 2001 From: Hoai Viet Nguyen <viet.nguyen@th-koeln.de> Date: Thu, 10 Apr 2025 06:47:31 +0200 Subject: [PATCH] add echo_handler and simple chat --- build.gradle | 1 + .../configs/WebSocketsConfig.kt | 18 +++++++++++ .../gm/websocketsdemo/handlers/EchoHandler.kt | 11 +++++++ .../handlers/SimpleChatHandler.kt | 23 +++++++++++++ src/main/resources/static/echoclient.html | 32 +++++++++++++++++++ src/main/resources/static/simplechat.html | 30 +++++++++++++++++ 6 files changed, 115 insertions(+) create mode 100644 src/main/kotlin/de/thk/gm/websocketsdemo/configs/WebSocketsConfig.kt create mode 100644 src/main/kotlin/de/thk/gm/websocketsdemo/handlers/EchoHandler.kt create mode 100644 src/main/kotlin/de/thk/gm/websocketsdemo/handlers/SimpleChatHandler.kt create mode 100644 src/main/resources/static/echoclient.html create mode 100644 src/main/resources/static/simplechat.html diff --git a/build.gradle b/build.gradle index faa97d4..efa4a43 100644 --- a/build.gradle +++ b/build.gradle @@ -26,6 +26,7 @@ dependencies { implementation 'org.jetbrains.kotlin:kotlin-reflect' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.jetbrains.kotlin:kotlin-test-junit5' + developmentOnly 'org.springframework.boot:spring-boot-devtools' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/configs/WebSocketsConfig.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/configs/WebSocketsConfig.kt new file mode 100644 index 0000000..72d1e33 --- /dev/null +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/configs/WebSocketsConfig.kt @@ -0,0 +1,18 @@ +package de.thk.gm.websocketsdemo.configs + +import de.thk.gm.websocketsdemo.handlers.EchoHandler +import de.thk.gm.websocketsdemo.handlers.SimpleChatHandler +import org.springframework.context.annotation.Configuration +import org.springframework.web.socket.WebSocketHandler +import org.springframework.web.socket.config.annotation.EnableWebSocket +import org.springframework.web.socket.config.annotation.WebSocketConfigurer +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry + +@Configuration +@EnableWebSocket +class WebSocketsConfig(): WebSocketConfigurer { + override fun registerWebSocketHandlers(registry: WebSocketHandlerRegistry) { + registry.addHandler(EchoHandler(), "/echo").setAllowedOrigins("*") + registry.addHandler(SimpleChatHandler(), "/chat") + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/EchoHandler.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/EchoHandler.kt new file mode 100644 index 0000000..a93ce45 --- /dev/null +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/EchoHandler.kt @@ -0,0 +1,11 @@ +package de.thk.gm.websocketsdemo.handlers + +import org.springframework.web.socket.TextMessage +import org.springframework.web.socket.WebSocketSession +import org.springframework.web.socket.handler.TextWebSocketHandler + +class EchoHandler : TextWebSocketHandler() { + override fun handleTextMessage(session: WebSocketSession, message: TextMessage) { + session.sendMessage(message) + } +} \ No newline at end of file diff --git a/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/SimpleChatHandler.kt b/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/SimpleChatHandler.kt new file mode 100644 index 0000000..c23c296 --- /dev/null +++ b/src/main/kotlin/de/thk/gm/websocketsdemo/handlers/SimpleChatHandler.kt @@ -0,0 +1,23 @@ +package de.thk.gm.websocketsdemo.handlers + +import org.springframework.web.socket.CloseStatus +import org.springframework.web.socket.TextMessage +import org.springframework.web.socket.WebSocketSession +import org.springframework.web.socket.handler.TextWebSocketHandler + +class SimpleChatHandler : TextWebSocketHandler() { + private var sessions: ArrayList<WebSocketSession> = ArrayList() + override fun afterConnectionEstablished(session: WebSocketSession) { + sessions.add(session) + } + + override fun handleTextMessage(session: WebSocketSession, message: TextMessage) { + for (session in sessions) { + session.sendMessage(message) + } + } + + override fun afterConnectionClosed(session: WebSocketSession, status: CloseStatus) { + sessions.remove(session) + } +} \ No newline at end of file diff --git a/src/main/resources/static/echoclient.html b/src/main/resources/static/echoclient.html new file mode 100644 index 0000000..7f5fad4 --- /dev/null +++ b/src/main/resources/static/echoclient.html @@ -0,0 +1,32 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Echo Demo</title> +</head> +<body> +<h1>Echo Demo</h1> +<input type="text" id="message"> +<button type="button" onclick="sendMessage()">Send</button> +<div id="echo"></div> + +<script> + var ws = new WebSocket("/echo") + + ws.onopen = function (event) { + alert("WebSocket successfully established") + } + + function sendMessage(){ + var message = document.getElementById("message").value + ws.send(message) + } + + ws.onmessage = function (message) { + echo.innerHTML += "<p>" + message.data + "</p>" + } + +</script> +</body> +</html> \ No newline at end of file diff --git a/src/main/resources/static/simplechat.html b/src/main/resources/static/simplechat.html new file mode 100644 index 0000000..37ee803 --- /dev/null +++ b/src/main/resources/static/simplechat.html @@ -0,0 +1,30 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <title>Simple Chat</title> +</head> +<body> + <h1>Simple Chat</h1> + <input type="text" id="username" placeholder="username"> + <input type="text" id="text" placeholder="message"> + <br> + <button onclick="sendMessage()">Send</button> + <div id="chat"></div> + <script> + var ws = new WebSocket("/chat") + var chat = document.getElementById("chat") + var message = {} + function sendMessage(){ + message.username = document.getElementById("username").value + message.text = document.getElementById("text").value + ws.send(JSON.stringify(message)) + } + + ws.onmessage = function (msg) { + message = JSON.parse(msg.data) + chat.innerHTML += "<p><b>"+message.username+":</b>" + message.text + "</p>" + } + </script> +</body> +</html> \ No newline at end of file -- GitLab