1

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.

joradev
  • 25
  • 5
  • Seems like this was answered already ... http://stackoverflow.com/questions/15646213/how-do-i-access-instantiated-websockets-in-jetty-9/15649791#15649791 – Joakim Erdfelt Jun 22 '16 at 23:04
  • Thanks Joakim Erdfelt for the solution!, i guess i dont used the correct words to find that thread. – joradev Jun 23 '16 at 22:53

0 Answers0