捕获haskell websockets示例服务器上的刷新?

时间:2017-05-20 15:07:00

标签: javascript haskell websocket

websockets服务器example按预期工作。在浏览器刷新(例如带有chrome的S-F5)上,websocket断开连接,仍然按预期工作。刷新后,用户必须再次命名才能连接到服务器。

您如何捕获刷新事件并保持用户连接?例如。 这只能在服务器端进行,还是客户端也需要修改? Haskell示例或链接到这样的内容会很好,以及有关如何执行此操作的提示!

1 个答案:

答案 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;
    };
});
  

...这只能在服务器端进行,还是客户端也需要修改?

它肯定需要在客户端完成自动重新连接。上面的裸机版本不需要对服务器进行任何更改,但是如果你想要更高级的东西,比如以某种方式处理/显示初始连接和自动重新连接的情况,则可能需要修改服务器。