正确关闭 WebSocket (HTML5,Javascript)

我正在使用 HTML5 WebSockets。我想知道,如何优雅地关闭连接?比如,如果用户刷新页面或者关闭浏览器会发生什么?

当用户只是刷新页面而没有调用 websocket.close()时,会出现一种奇怪的行为——当他们在刷新后返回时,页面会触发 websocket.onclose事件。

208884 次浏览

很简单,你关上它:)

var myWebSocket = new WebSocket("ws://example.org");
myWebSocket.send("Hello Web Sockets!");
myWebSocket.close();

你有没有检查过 下列地点Opera 介绍文章

根据 协议规范 v76(浏览器当前支持的版本) :

为了干净利落地关闭连接,只包含一个0xFF 字节的帧 后面跟着一个0x00字节是从一个对等点发送,要求另一个对等点 关闭连接。

如果正在编写服务器,则应确保在服务器关闭客户端连接时发送关闭帧。普通的 TCP 套接字关闭方法有时会比较慢,导致应用程序认为连接仍然是打开的,即使连接没有打开。

当您关闭或重新加载页面时,浏览器应该真正为您做到这一点。但是,可以通过捕获 before unload 事件来确保发送关闭帧:

window.onbeforeunload = function() {
websocket.onclose = function () {}; // disable onclose handler first
websocket.close();
};

我不确定在页面刷新后如何获得 onclose 事件。一旦页面重新加载,websocket 对象(使用 onclose 处理程序)将不再存在。如果你在页面加载时立即尝试在你的页面上建立一个 WebSocket 连接,那么你可能会遇到一个问题: 在旧的连接断开后不久,服务器拒绝了一个新的连接(或者浏览器在你试图连接的时候还没有准备好建立连接) ,并且你得到了一个新的 webSocket 对象的 onclose 事件。

现在使用的 WebSocket 有两个主要的协议版本。旧版本使用 [0x00][message][0xFF]协议,新版本使用 混合格式的数据包

Opera 和 iPod/iPad/iphone 使用旧的协议版本,因此在 WebSocket 服务器中实现向下兼容实际上很重要。在这些浏览器使用旧协议时,我发现刷新页面,或者从页面导航离开,或者关闭浏览器,所有这些都会导致浏览器自动关闭连接。太好了! !

然而,对于使用新协议版本的浏览器(例如。只有关闭浏览器才会导致浏览器自动关闭连接。也就是说,如果刷新页面,或者导航离开页面,浏览器不会自动关闭连接。然而,浏览器所做的是向服务器发送一个 hybi 数据包,第一个字节(原始标识符)是 0x88(更广为人知的是关闭数据帧)。一旦服务器收到这个数据包,它可以强制关闭连接本身,如果您这样选择。

正如 Theoobe所提到的,一些浏览器不会自动关闭 websocket。不要尝试处理任何“关闭浏览器窗口”的客户端事件。目前还没有可靠的方法来做到这一点,如果你考虑支持主要的桌面 还有移动浏览器(例如 onbeforeunload将不能在 Mobile Safari 中工作)。我在处理服务器端的这个问题方面有很好的经验。例如,如果你使用 Java EE,看一下 Websocket 端点,如果你关闭/重新加载浏览器窗口,它会根据浏览器调用 OnClose方法或者 OnError方法。

通过使用 WebSocket 的关闭方法,可以根据需要编写任何函数。

var connection = new WebSocket('ws://127.0.0.1:1337');
connection.onclose = () => {
console.log('Web Socket Connection Closed');
};

请用这个

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();
});

关闭浏览器不会触发 Websocket 关闭事件。必须手动调用 socket.close()