2
votes

I am trying to build a WebSocket Server in Java, and to connect with a simple javascript WebSocketClient. Now i want to "give" every incoming session an unique instance of an object which is created on onopen, their methods called on onmessage and destroyed on onclose. How can i manage these object ? is there a way to store it in the sessions? or does the server itself handle such things, and i can just define a private variable in the "Endpoint class"?

package com.xxx.server;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.glassfish.tyrus.server.Server;

public class TestWebSocketServer {
    public static void main(String[] args) {
        runServer();
    }

    public static void runServer() {
        Server server = new Server("localhost", 21212, "/xxx", TestServerEndpoint.class);

        try {
            server.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Please press a key to stop the server.");
            reader.readLine();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            server.stop();
        }
    }
}

package com.xxx.server;

import java.io.IOException;
import java.util.logging.Logger;

import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.CloseReason.CloseCodes;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint(value = "/TEST")
public class TestServerEndpoint {

    private Logger logger = Logger.getLogger(this.getClass().getName());

    @OnOpen
    public void onOpen(Session session) {
        logger.info("Connected ... " + session.getId());
    }

    @OnMessage
    public String onMessage(String message, Session session) {
        switch (message) {
        case "quit":
            try {
                session.close(new CloseReason(CloseCodes.NORMAL_CLOSURE, "Test ended"));
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            break;
        }
        return message;
    }

    @OnClose
    public void onClose(Session session, CloseReason closeReason) {
        logger.info(String.format("Session %s closed because of %s", session.getId(), closeReason));
    }
}
1

1 Answers

2
votes

You don't need to handle these objects yourself, the Java EE server handles it. Your just need to create an instance variable in the endpoint class. For example,

@ServerEndpoint(value = "/test-server/")
public class TestWebSocketServer {
  private YourObject yourObject = new YourObject();
  //or instantiate it in constructor    
}

The Java EE server will create a new yourObject whenever you open a new websocket connection to the server and will make it ready for garbage collection when you close the connection.