Humberd
Humberd

Reputation: 2953

WebSocket - Javascript client says connected, but Java server doesn't

I have very simple code, yet, it doesn't work perfectly.
In Java server it just says Hello and Bye when opening and closing a connection and prints a sent message:

@ApplicationScoped
@ServerEndpoint("/tictactoe")
public class WebSocketServer {
    private Logger logger = Logger.getLogger(this.getClass().getName());

    @OnOpen
    public void open(Session session) {
        logger.info("WebSocket: Hello - " + session.getId());
    }

    @OnClose
    public void close(Session session) {
        logger.info("WebSocket: Farewell - " + session.getId());
    }

    @OnMessage
    public void messageHandler(String message, Session session) {
        logger.info("WebSocket: New Message - " + message);
    }
}

In JavaScript it does pretty much the same like in the server and sends a message when clicking a button:

var socket = new WebSocket("ws://localhost:8080/TicTacToeZTP/tictactoe");
    socket.onopen = function (event) {
        console.log("WebSocket: Connected");
        console.log("WebSocket: " + checkConnection(socket.readyState));
    };
    socket.onclose = function (event) {
        console.log("WebSocket: Disconnected");
    };
    socket.onerror = function(event) {
        console.log("WebSocket: Error");
    };
    socket.onmessage = function (event) {
        console.log("WebSocket: New Message - " + event.data);
    };

    function checkConnection(readyState) {
        switch(readyState){
            case 0: return "CONNECTING";
            case 1: return "OPEN";
            case 2: return "CLOSING";
            case 3: return "CLOSED";
            default: return "UNDEFINED";
        }
    }

    $("#send").click(function () {
        var msg = {
            type: "message",
            text: "zaladzi"
        };
        socket.send(JSON.stringify(msg));
    });

Now its time for a problem. After refreshing a page with an established connection.
What the script says:

WebSocket: Connected
WebSocket: OPEN

But the server doesn't open a new one. In fact I sometimes need a couple of refreshes to open a new connection on the server.
What the server says:

Info:   WebSocket: Hello - 29538711-f815-4c59-835e-97aaaac1d112
Info:   WebSocket: Farewell - 29538711-f815-4c59-835e-97aaaac1d112

I'm using Payara 4.1 server. How to solve this issue?
TL/DR JavaScript client says connection is opened, but Java client says there is no such a connection.

Upvotes: 0

Views: 651

Answers (1)

leet java
leet java

Reputation: 304

This is likely due to a bug in Payara Server which is fixed https://github.com/payara/Payara/issues/536 in that bug OnOpen isn't called in the server when a socket is reused.

You could try a pre-release version of Payara to ensure it is fixed. Pre-release builds are available from the Payara website a new pre-release build is created and uploaded every time their Jenkins CI server completes a GitHub merge build.

Upvotes: 1

Related Questions