From 9d54842c2f5b084ab1b0de4c4b8978cc43297546 Mon Sep 17 00:00:00 2001 From: Mike Vink Date: Tue, 13 Jul 2021 18:30:12 +0200 Subject: feat(WebSockets): client server WebSocket connect --- api/src/main/java/akkamon/api/App.java | 42 +++++++++++++++++++++ api/src/main/java/akkamon/api/EventSocket.java | 52 ++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 api/src/main/java/akkamon/api/App.java create mode 100644 api/src/main/java/akkamon/api/EventSocket.java (limited to 'api/src') diff --git a/api/src/main/java/akkamon/api/App.java b/api/src/main/java/akkamon/api/App.java new file mode 100644 index 0000000..bc462d0 --- /dev/null +++ b/api/src/main/java/akkamon/api/App.java @@ -0,0 +1,42 @@ +package akkamon.api; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer; + + +public class App { + + public static void main(String[] args) { + Server server = new Server(); + ServerConnector connector = new ServerConnector(server); + connector.setPort(8080); + server.addConnector(connector); + + // application "context" ? + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); + context.setContextPath("/"); + server.setHandler(context); + + // websocket behaviour + // Configure specific websocket behavior + JettyWebSocketServletContainerInitializer.configure(context, (servletContext, wsContainer) -> + { + // Configure default max size + wsContainer.setMaxTextMessageSize(65535); + + // Add websockets + wsContainer.addMapping("/", EventSocket.class); + }); + + try { + server.start(); + server.join(); + } + catch (Throwable t) { + t.printStackTrace(System.err); + } + + } +} diff --git a/api/src/main/java/akkamon/api/EventSocket.java b/api/src/main/java/akkamon/api/EventSocket.java new file mode 100644 index 0000000..1c7bafc --- /dev/null +++ b/api/src/main/java/akkamon/api/EventSocket.java @@ -0,0 +1,52 @@ +package akkamon.api; + +import java.util.Locale; +import java.util.concurrent.CountDownLatch; + +import org.eclipse.jetty.websocket.api.WebSocketAdapter; +import org.eclipse.jetty.websocket.api.Session; +import org.eclipse.jetty.websocket.api.StatusCode; + + +public class EventSocket extends WebSocketAdapter { + private final CountDownLatch closureLatch = new CountDownLatch(1); + + @Override + public void onWebSocketConnect(Session sess) + { + super.onWebSocketConnect(sess); + System.out.println("Socket Connected: " + sess); + } + + @Override + public void onWebSocketText(String message) + { + super.onWebSocketText(message); + System.out.println("Received TEXT message: " + message); + + if (message.toLowerCase(Locale.US).contains("bye")) { + getSession().close(StatusCode.NORMAL, "Thanks"); + } + } + + @Override + public void onWebSocketClose(int statusCode, String reason) + { + super.onWebSocketClose(statusCode, reason); + System.out.println("Socket Closed: [" + statusCode + "] " + reason); + closureLatch.countDown(); + } + + @Override + public void onWebSocketError(Throwable cause) + { + super.onWebSocketError(cause); + cause.printStackTrace(System.err); + } + + public void awaitClosure() throws InterruptedException + { + System.out.println("Awaiting closure from remote"); + closureLatch.await(); + } +} -- cgit v1.2.3