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