1.1.44. fejezet, WebSocket

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

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ányMéret
Csomag ikon Homework4WebSocketServer.zip21.57 KB