Accept WebSocket Connections
Similar to regular Sites that respond to HTTP requests, you can add WebSocketSites that handle WebSocket connections.
@AppType(name = "wsecho")
public class EchoWebSocketApp extends App {
@Override
public void start() {
SiteLocation location = getConfig().getLocation("location").orError();
addWebSocketSite(location, websocket -> {
// Accept or immediately close
HTTPRequest initreq = websocket.getHTTPRequest();
String name = initreq.getQuery("name");
if (name == null) {
websocket.close(1008, "Please provide a name");
return;
}
websocket.accept();
// Lifecycle
while (true) {
String message = websocket.receiveText(); // may throw WebSocketCloseException
if (message.equals("close"))
break;
websocket.sendText(name + ": " + message);
}
// Close
websocket.close();
});
}
}
WebSockets resemble standard synchronous Java Sockets, but with extra methods specific to WebSockets.
While you may choose to use the thread calling your WebSocketSite for the lifetime of the websocket (and longer), you also may (and typicall will) keep and use the websocket in other threads.
That is fine, but mind to always call either accept() or close() directly in the WebSocketSites handling method, as the server will interpret doing neither as the WebSocket connection remaining unhandled by the WebSocketSite, which would prohibit you from using it anymore.
While WebSocket.accept() is called automatically when using other WebSocket methods, like receiveText or sendText as in the example above, I recommend calling it explicity.