javascript - 在 haskell websockets 示例服务器上捕获刷新?

标签 javascript haskell websocket

Websockets 服务器 example按预期工作。刷新浏览器(例如带有 chrome 的 S-F5)时,Websocket 会断开连接,但仍按预期工作。刷新后,用户必须再次输入名称才能连接到服务器。

您将如何捕获刷新事件并保持用户连接?例如。 这仅在服务器端可行还是客户端也需要修改? Haskell 示例或此类链接以及有关如何执行此操作的提示都很好!

最佳答案

How would you capture the refresh-event...

实际上并没有刷新事件这样的东西需要检测(我很乐意在这方面被证明是错误的!)

... and keep the user connected...

刷新,或者更确切地说,在再次加载页面之前离开页面,会导致 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;
    };
});

... Is this doable only on server side or does the client require modifications as well?

它肯定需要在客户端中完成某些操作才能自动重新连接。上面的基本版本不需要对服务器进行任何更改,但如果您想要一些更奇特的东西,例如以某种方式以不同方式处理/显示初始连接和自动重新连接的情况,那么可能需要修改服务器。

关于javascript - 在 haskell websockets 示例服务器上捕获刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44087446/

相关文章:

haskell - Haskell 中的无限惰性阶乘

haskell - 用 haskell 编写迷你语言, "while"语句和 block { } 出现问题

haskell - "Any function on finite lists that is defined by pairing the desired result with the argument list can always be redefined in terms of fold"

javascript - Websockets 数据困惑

amazon-web-services - 带有 esp8266 的 AWS 物联网

javascript - Blueimp Bootstrap-Image-Gallery 在页面加载时直接初始化为灯箱/以编程方式打开灯箱

javascript - 追加到 jquery 中的列表

javascript - Node.js WebSocket 广播

Javascript - 从元素中删除句子(不包含 id/class),但保留其余内容

javascript - 如何使用 div 容器调整 Youtube 视频大小