【问题标题】:Websockets+Single instance+crosstab communication best way?Websockets+单实例+交叉表通信的最佳方式?
【发布时间】:2018-10-22 02:02:53
【问题描述】:

我正在使用 websockets 来传递 json 消息,但如果打开多个选项卡,我不想要多个 ws 连接。

为了减少连接,我想实现一个单一的 ws 连接对象,该对象可以向我的网站的所有选项卡发送/接收消息。该对象应将 json 转发到所有选项卡,每个选项卡都会处理该消息。

我一直在关注网络/共享/服务工作者,但我不确定 2018 年解决问题的路径,浏览器支持似乎也是一个问题。

Safari 中似乎不支持共享工作人员以支持服务工作人员。 Chrome/ff/opera 似乎支持共享工作者。

简而言之,这有点令人困惑,有点混乱,我想知道最好的前进道路和最好的支持。

如果你知道一个好的资源,用你建议的方法实现 ws 的示例代码也请提供。

【问题讨论】:

  • 我遇到了同样的问题,尝试使用Indexeddb 解决,但我在不同选项卡之间遇到了一些读/写问题,您是否建议改用WW

标签: websocket service-worker web-worker shared-worker


【解决方案1】:

经过进一步研究,我决定实施网络工作者。

在这一点上,我取得了成功,我想为未来的读者添加一个我坚持的重要文章。

在我的 worker.js 文件中,我将它放在顶部以启动。如果我不这样做,importScripts 函数会引发错误。

另外,为了提供帮助,这是我的 worker.js 文件中有效的框架代码。来自 html 页面的消息处理与从服务器接收到的 ws 消息是分开的。您可以从 html 页面启动、停止 worker。

所有标签都会从worker中获取消息,每个页面都需要根据需要处理消息。

我还使用了强大的 websockets,因此它会自动从这个 github 重新连接,因为此代码适用于 web 工作者并得到维护。到本文发布时,还有另一个同名项目尚未更新。 reconnecting-websockets 不支持 web worker,你会得到一个错误。 - https://github.com/nathanboktae/robust-websocket

html

<script>
document.addEventListener('DOMContentLoaded', init);

function init(){
    worker = new Worker('js/ws_worker.js');
    worker.addEventListener('message', workerMessaged);

    worker.postMessage({ "args": '<username_admin>', "cmd": 'start', "url": '127.0.0.1:8000' });
    worker.postMessage({ "message": 'Initialize new worker'});
    console.log('Message posted to worker, start');
}

// Received a json message from the Worker, process it.
function workerMessaged(ev){
    console.log('Message received from worker');
    console.log(ev.data);
    worker.postMessage({ "cmd": 'message', "message": 'Sending reply over ws'});
}

worker.js

// proper initialization
if( 'function' === typeof importScripts) {
importScripts('robust-websocket.js');

var WebSocket;


self.addEventListener("message", function(e) {
    var args = e.data.args;
    var cmd = e.data.cmd;
    var roomName = e.data.args;
    var url = e.data.url;
    var message = e.data;
    // Code to process ws messages from the server
    WebSocket.onmessage = function(event) {
        console.log(" WebSocket message received: " + event.data, event);
        self.postMessage(event.data);
    };

    WebSocket.onerror = function(event) {
        console.log(" WebSocket message received: " + event.data, event);
        self.postMessage(event.data);
    };

    if (cmd === 'start') {
        WebSocket = new RobustWebSocket(
        'ws://' + url +
        '/ws/' + roomName + '/');

        console.log('Connected via websockets');

        /* Send initial message to open the connection and finalize the ws object*/
        WebSocket.onopen = function() {
            var obj = { "message": "hello" };
            var json = JSON.stringify(obj);
            WebSocket.send(json);
        };

    } else if (cmd === 'stop') {
        WebSocket.onclose = function() {
            console.log('Closing WebSocket');
            WebSocket.close();
            console.log('Closed WebSocket');
            console.log('Terminating Worker');
            self.close(); // Terminates the worker.
        };

    } else if (cmd === 'message') {
        WebSocket.onopen = function() {
            var json = JSON.stringify(message);
            WebSocket.send(json);
        };
        console.log('message sent over websocket');
        console.log('message');

    } else {
        console.log('logging error ' + e.data);
        console.log(e.data);
        self.postMessage('Unknown command: ');
    }

}, false);

};

【讨论】:

    猜你喜欢
    • 2013-09-09
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多