客户端脱机时,websocket onclose在Java中不起作用

时间:2018-03-23 08:00:59

标签: javascript java tomcat websocket

我发现websocket会在我的客户端(Chrome 65.0.3325.181 windows10 x64)离线时关闭,这是我的预期。但是我的服务器(JavaWeb项目,Tomcat 7.0.79和8.5.24)并没有关闭。 如何在客户端离线时关闭服务器中的websocket?

JS代码:

var ws;
var wsUrl = 'wss://' + location.host + '/test-websocket';

window.onload = function () {
    createWebSocket(wsUrl);
};

window.onbeforeunload = function () {
    ws.close();
};

function createWebSocket(url) {
    ws = new WebSocket(url);
    initEventHandle();
}

function initEventHandle() {
    ws.onerror = function () {
        console.log("error");
    };
    ws.onclose = function () {
        console.log("close");
    };
    ws.onopen = function () {
        setInterval(function () {
            var message = {
                id: "ping"
            };
            sendMessage(message);
        }, 5000);
    };
    ws.onmessage = function (message) {
        console.info('Received message: ' + message.data);
    }
}

function sendMessage(message) {
    const jsonMessage = JSON.stringify(message);
    console.log('Senging message: ' + jsonMessage);
    ws.send(jsonMessage);
}

Java代码:

private static final Gson GSON = new GsonBuilder().create();

@OnMessage
public void onMessage(String message, final Session session) throws IOException {
    JsonObject jsonMessage = GSON.fromJson(message, JsonObject.class);
    System.out.println(jsonMessage);
    session.getBasicRemote().sendText("pong");
}

@OnError
public void onError(Throwable error) {
    error.printStackTrace();
}

@OnClose
public void onClose(CloseReason reason) {
    System.out.println(reason.toString());
}

一般情况下,例如关闭网页,我可以看到" CloseReason:代码[1000],原因[null]"在服务器输出中。

但是当客户端离线时,onclose将在客户端工作,记录"关闭"在控制台。但是在服务器输出中不会打印任何内容。

这就是为什么我认为当客户端离线时,websocket onclose在Java中不起作用。

那么,当客户端离线时如何关闭服务器中的websocket?

0 个答案:

没有答案