I have a little eclipse Jetty websockets example program where JavaScript clients can connect and disconnect to the Java Server, and i want to send a simple message to all connected clients (broadcast a message).
import java.io.IOException;
import java.util.ArrayList;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.websocket.server.WebSocketHandler;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
public class WebSocketTest {
private static final WebSocketTest webSocketTestInstance = new WebSocketTest();
private static ArrayList<MyWebSocketHandler> clients = new ArrayList<>();
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
WebSocketHandler wsHandler = new WebSocketHandler() {
@Override
public void configure(WebSocketServletFactory factory) {
factory.register(MyWebSocketHandler.class);
}
};
server.setHandler(wsHandler);
server.start();
//this is for testing only
for(int i=0; i<10;i++){
try {
Thread.sleep(3000);
} catch(InterruptedException ex) {Thread.currentThread().interrupt();}
broadcast("Test Message!"+i);
}
server.join();
}
public static WebSocketTest getServer() {
return webSocketTestInstance;
}
public static void addClient(MyWebSocketHandler client) {
clients.add(client);
}
public static void broadcast(String msg){
for( MyWebSocketHandler client : clients ){
if ( client.session.isOpen() ){
try{
client.session.getRemote().sendString(msg);
} catch (IOException e) {}
}
}
}
}
@WebSocket
public class MyWebSocketHandler {
public Session session;
private WebSocketTest server = WebSocketTest.getServer();
@OnWebSocketClose
public void onClose(int statusCode, String reason) {
System.out.println("Close: statusCode=" + statusCode + ", reason=" + reason);
}
@OnWebSocketError
public void onError(Throwable t) {
System.out.println("Error: " + t.getMessage());
}
@OnWebSocketConnect
public void onConnect(Session session) {
this.session = session;
this.server.addClient(this);
System.out.println("Connect: " + session.getRemoteAddress().getAddress());
try {
session.getRemote().sendString("Hello Webbrowser");
} catch (IOException e) {
e.printStackTrace();
}
}
@OnWebSocketMessage
public void onMessage(String message) {
System.out.println("Message: " + message);
}
// sends message to browser
public void send(String message) {
try {
if (session.isOpen()) {
session.getRemote().sendString(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Currently i get the WebSocketTest
Instance in the MyWebSocketHandler
, and then i call the .addClient(this)
method to store the client in a client list, so later i can iterate the client list and send a message to each client. Although this works, i don't like the solution.
My question is: Do the jetty.Server
class has a method or any way to get the client sessions easily?(like server.getAllSessions() or getAllClients()). I checked the documentation of the Server
class and i didn't find anything.