websockets服务器example按预期工作。在浏览器刷新(例如带有chrome的S-F5)上,websocket断开连接,仍然按预期工作。刷新后,用户必须再次命名才能连接到服务器。
您如何捕获刷新事件并保持用户连接?例如。 这只能在服务器端进行,还是客户端也需要修改? Haskell示例或链接到这样的内容会很好,以及有关如何执行此操作的提示!
答案 0 :(得分:2)
您将如何捕获刷新事件...
要检测的刷新事件真的不是这样的事情(我希望在此证明是错误的!)
...并保持用户连接......
刷新,或者更确切地说,在再次加载页面之前离开页面会导致websocket断开连接,并且(特别是如果这是打开的网站上唯一的页面),实际上并不多你可以做到这一点。
所以唯一可以做的就是在下次加载页面时进行某种自动重新连接。允许这样的解决方案是......
本地存储就是保存此功能的地方,如下例所示,从https://github.com/jaspervdj/websockets/tree/master/example修改以从本地存储中保存/检索名称。
$(document).ready(function () {
var savedUser = sessionStorage.getItem("rejoin-user");
if (savedUser) {
joinChat(savedUser);
}
$('#join-form').submit(function () {
joinChat($('#user').val())
});
function joinChat(user) {
sessionStorage.setItem("rejoin-user", user);
$('#warnings').html('');
var ws = createChatSocket();
ws.onopen = function() {
ws.send('Hi! I am ' + user);
};
ws.onmessage = function(event) {
if(event.data.match('^Welcome! Users: ')) {
/* Calculate the list of initial users */
var str = event.data.replace(/^Welcome! Users: /, '');
if(str != "") {
users = str.split(", ");
refreshUsers();
}
$('#join-section').hide();
$('#chat-section').show();
$('#users-section').show();
ws.onmessage = onMessage;
$('#message-form').submit(function () {
var text = $('#text').val();
ws.send(text);
$('#text').val('');
return false;
});
} else {
$('#warnings').append(event.data);
ws.close();
}
};
$('#join').append('Connecting...');
return false;
};
});
...这只能在服务器端进行,还是客户端也需要修改?
它肯定需要在客户端完成自动重新连接。上面的裸机版本不需要对服务器进行任何更改,但是如果你想要更高级的东西,比如以某种方式处理/显示初始连接和自动重新连接的情况,则可能需要修改服务器。