1.1.44. fejezet, WebSocket
Beküldte pzoli - 2022, május 21 - 10:25de
Java Szerver
A szerver egy Wildfly 11 alkalmazás szerveren futó Java EE7 WebService, kísérleti jelleggel localhost-on nyitja meg a 8080-as portot.
package hu.infokristaly.websocket; import java.io.IOException; import java.util.HashMap; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import javax.websocket.EncodeException; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; @ServerEndpoint(value = "/chat/{username}", decoders = MessageDecoder.class, encoders = MessageEncoder.class) public class Homework4WebSocketServerEndpoint { private Session session; private static Set<Homework4WebSocketServerEndpoint> chatEndpoints = new CopyOnWriteArraySet<>(); private static HashMap<String, String> users = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam("username") String username) throws IOException { this.session = session; chatEndpoints.add(this); users.put(session.getId(), username); Message message = new Message(); message.setFrom(username); message.setContent("Connected!"); try { broadcast(message); } catch (IOException | EncodeException e) { e.printStackTrace(); } } @OnMessage public void onMessage(Session session, Message message) throws IOException { message.setFrom(users.get(session.getId())); try { broadcast(message); } catch (IOException | EncodeException e) { e.printStackTrace(); } } @OnClose public void onClose(Session session) throws IOException { chatEndpoints.remove(this); Message message = new Message(); message.setFrom(users.get(session.getId())); message.setContent("Disconnected!"); try { broadcast(message); } catch (IOException | EncodeException e) { e.printStackTrace(); } } @OnError public void onError(Session session, Throwable throwable) { // Do error handling here } private static void broadcast(Message message) throws IOException, EncodeException { chatEndpoints.forEach(endpoint -> { synchronized (endpoint) { try { endpoint.session.getBasicRemote().sendObject(message); } catch (IOException | EncodeException e) { e.printStackTrace(); } } }); } }
JavaScript kliens
- forrás: WebSocket (javascript.info)
A kliens egy böngészőbe betöltött HTML lap, amit nem localhost-ról szolgáltatunk.
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> socket = new WebSocket("ws://localhost:8080/Homework4WebSocketServer/chat/hello"); socket.onopen = function(e) { alert("[open] Connection established"); alert("Sending to server"); socket.send("{\"from\":\"pzoli\",\"to\":\"pepe\",\"content\":\"Hi there\"}"); }; socket.onmessage = function(event) { alert('[message] Data received from server: ${event.data}'); }; socket.onclose = function(event) { if (event.wasClean) { alert('[close] Connection closed cleanly, code=${event.code} reason=${event.reason}'); } else { // e.g. server process killed or network down // event.code is usually 1006 in this case alert('[close] Connection died'); } }; socket.onerror = function(error) { alert('[error] ${error.message}'); }; </script> </head> <body> </body> </html>
A távoli szerverről betöltött HTML oldalba ágyazott JavaScript-ben a WebSocket kliens képes csatlakozni a localhost-on futó WebSocket szerverhez, ami lehet akármilyen nyelven írt microservice alkalmazás is. Így az ActiveX-nél vagy Applet-eknél és JavaWebStart megoldásoknál jóval egyszerűbb a fejlesztése a könnyebben debug-olhatóság miatt.
Kapcsolódó hivatkozások
Csatolmány | Méret |
---|---|
Homework4WebSocketServer.zip | 21.57 KB |
- A hozzászóláshoz be kell jelentkezni