我发现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?