我正在尝试使用HTML5 WebSockets。我想知道如何优雅地关闭连接?例如,如果用户刷新页面或关闭浏览器会发生什么?
如果用户在不调用websocket.close()
的情况下刷新页面,会出现奇怪的行为 - 刷新后将触发websocket.onclose
事件。
我正在尝试使用HTML5 WebSockets。我想知道如何优雅地关闭连接?例如,如果用户刷新页面或关闭浏览器会发生什么?
如果用户在不调用websocket.close()
的情况下刷新页面,会出现奇怪的行为 - 刷新后将触发websocket.onclose
事件。
如果你正在编写服务器,应确保在服务器关闭客户端连接时发送关闭数据帧。通常的TCP套接字关闭方法有时会很慢,并导致应用程序认为连接仍然打开,即使它已经关闭。为了清除连接,一个由仅含0xFF和0x00字节的数据帧会被发送,要求另一个节点关闭连接。
window.onbeforeunload = function() {
websocket.onclose = function () {}; // disable onclose handler first
websocket.close();
};
[0x00][message][0xFF]
协议,而新版使用Hybi格式数据包。0x88
(更好地称为关闭数据帧)的hybi数据包。一旦服务器接收到此数据包,它可以强制关闭连接(如果您选择这样做)。onbeforeunload
无法工作),目前还没有可靠的方法来解决这个问题。我在服务器端处理此问题方面有很好的经验。例如,如果您使用Java EE,请查看javax.websocket.Endpoint,取决于浏览器,如果您关闭/重新加载浏览器窗口,则会调用OnClose
方法或OnError
方法。var uri = "ws://localhost:5000/ws";
var socket = new WebSocket(uri);
socket.onclose = function (e){
console.log(connection closed);
};
window.addEventListener("unload", function () {
if(socket.readyState == WebSocket.OPEN)
socket.close();
});
socket.close()
。var connection = new WebSocket('ws://127.0.0.1:1337');
connection.onclose = () => {
console.log('Web Socket Connection Closed');
};
beforeunload
事件应该避免使用。来自MDN:
特别是在移动设备上,beforeunload事件不可靠。
此外,它只应用于保存用户数据,而不是关闭websocket连接。
与其在beforeunload
上关闭连接,我会使用pagehide
或(备选)unload
事件,正如Chrome开发者文档所建议的那样。
const terminationEvent = 'onpagehide' in self ? 'pagehide' : 'unload';
window.addEventListener(terminationEvent, (event) => {
if (event.persisted === false) {
// client is gone
socket.onclose = function () { };
socket.close();
}
});
window.addEventListener("beforeunload", () => return "Are you sure?");
),而不会断开用户的连接。如果用户实际上没有离开页面,这可能导致意外关闭 WebSocket 连接。此时文档仍然可见,事件仍然可取消。
onbeforeunload
事件无法正常工作。 - artkoenig