Here is such a solution from - com.neovisionary.ws.client.Web socket - https://github.com/TakahikoKawasaki/nv-websocket-client
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.neovisionaries.ws.client.WebSocket;
import com.neovisionaries.ws.client.WebSocketAdapter;
import com.neovisionaries.ws.client.WebSocketException;
import com.neovisionaries.ws.client.WebSocketFactory;
import com.neovisionaries.ws.client.WebSocketFrame;
public class WssM {
    public static List<String> ListMessage = new ArrayList<>();
    public static boolean WebSocketLog = true;
    public static final String WssURL = "wss://site.com/api/sport_tree_ws/v1";
    public static final String WebsocketMessage = "{\"type\": \"subscribe_state\", \"subscribe_state\": {\"uid\": \"-1\"}}";
    
    public static void main(String[] args) throws IOException, WebSocketException {
        WebSocket socket = connect(WssURL);
        BufferedReader in = getInput();
        socket.sendText(WebsocketMessage);
        String text;
        try {
            while ((text = in.readLine()) != null) {
                if (text.equals("exit")) break;
                if (!socket.isOpen()) {
                    System.out.println("Socket is closed. Trying to reconnect...");
                    socket.recreate().connect();
                    System.out.println("Reconnected!");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (socket.isOpen()) {
                System.out.println("Disconnecting connection to server!");
                socket.disconnect(); //Close the WebSocket.
            }
        }
    }
    private static WebSocket connect(String Host) throws IOException, WebSocketException {
        WebSocketFactory wsFactory = new WebSocketFactory().setConnectionTimeout(55000);
        WebSocket socket = wsFactory.createSocket(URI.create(Host)).addProtocol("json");//.addHeader("Sec-WebSocket-Protocol", "json")
        //WebSocket socket = wsFactory.createSocket(URI.create(HOST + "?Authorization=" + DUMMY_JWT_TOKEN));
        socket.addListener(new WebSocketAdapter() {
            @Override
            public void onSendingHandshake(WebSocket websocket, String requestLine, List<String[]> headers) {
                if (WebSocketLog) System.out.println(requestLine);
                for (String[] header : headers) { //Print the header, "{name}: {value}"
                    if (WebSocketLog) System.out.format("%s: %s\n", header[0], header[1]);
                }
            }
            @Override
            public void onConnected(WebSocket websocket, Map<String, List<String>> headers) {
                if (WebSocketLog) System.out.println("Success! WebSocket - Connected!");
            }
            @Override
            public void onTextMessage(WebSocket websocket, String text) {
                if (WebSocketLog) System.out.printf("MessageToClient: %s%n", text); ListMessage.add(text);
            }
            @Override
            public void onDisconnected(WebSocket websocket, WebSocketFrame serverCloseFrame, WebSocketFrame clientCloseFrame, boolean closedByServer) {
                if (WebSocketLog) System.out.println("Disconnecting...");
                if (WebSocketLog) System.out.printf(" Opcode: %d%n", serverCloseFrame.getOpcode());
            }
            @Override
            public void onPongFrame(WebSocket websocket, WebSocketFrame frame) {
                if (WebSocketLog) System.out.printf("Received some pong..!! Payload text: %s%n", frame.getPayloadText());
                System.out.printf(" Opcode: %d%n", frame.getOpcode());
            }
            @Override
            public void onPingFrame(WebSocket websocket, WebSocketFrame frame) {
                if (WebSocketLog) System.out.printf("I have been pinged by server at %s%n", LocalDateTime.now());
                websocket.sendPong("Ponging from client");
            }
            @Override
            public void onTextFrame(WebSocket websocket, WebSocketFrame frame) {
                if (WebSocketLog) System.out.printf("onTextFrame - %s%n", LocalDateTime.now());
                websocket.sendPong("onTextFrame from client");
            }
            @Override
            public void onError(WebSocket websocket, WebSocketException cause) {
                System.out.printf("I have received exception %s%n", cause.getMessage());
            }
        }).connect();
        return socket;
    }
    private static BufferedReader getInput() {
        return new BufferedReader(new InputStreamReader(System.in));
    }
}