diff --git a/build.gradle b/build.gradle index faa97d49e633f8a910a0956b172fdc2ed19d7e70..efa4a43452e7e9a2bf2debfa357037c30d4465be 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 0000000000000000000000000000000000000000..72d1e33087b7280f0ba96f4015d9c16e84c7b130 --- /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 0000000000000000000000000000000000000000..a93ce454dda7bd30326179cbcf9534cb34a455bc --- /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 0000000000000000000000000000000000000000..c23c2966391d543060ce670e25eec4b1e4fda7f4 --- /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 0000000000000000000000000000000000000000..7f5fad45422596ca796848df6d490fb89a224a10 --- /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 0000000000000000000000000000000000000000..37ee803ab2fad15e217cb3a248f7ff398591b9a5 --- /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