【问题标题】:HTML5 Websocket within WebworkerWebworker 中的 HTML5 Websocket
【发布时间】:2013-08-01 15:16:38
【问题描述】:

我已经设法让 websockets 在使用 Chrome 的 webworker 内部工作,但仅用于接收数据。当我尝试发送数据时,我得到一个 DOM 异常,有没有人设法发送数据?

这就是我的网络工作者所拥有的。

self.addEventListener('message', function(e) {
var data = e.data;

switch (data.cmd) {
    case 'init':
        self.postMessage("Initialising Web Workers...");
        testWS();
        break;
    default:
        self.postMessage('Unknown command: ' + data.msg);
    };
}, false);

function testWS() {
    var connectionAddr = "ws://localhost:8003";
    var socket = new WebSocket(connectionAddr);
    socket.onmessage = function(event) {
        self.postMessage('Websocket : ' + event.data);
    };

    socket.onclose = function(event) {
    };

    function send(message) {
        socket.send(message);
    }

    send("hello"); //Here is where the exception is thrown
}

【问题讨论】:

    标签: javascript websocket web-worker


    【解决方案1】:

    您必须在发送第一条消息之前监听 onopen websocket 事件。

    socket.onopen = function(){
        // send some message   
    };
    

    【讨论】:

    • 是的,你是对的,只是在回头看之前发现,连接没有打开,这就是问题所在。干杯
    【解决方案2】:

    试试这个:

    var WebSocketStateEnum = {CONNECTING: 0, OPEN: 1, CLOSING: 2, CLOSED: 3};
    
    var wsChannel;
    var msgQueue = [];
    
    // Using like this:
    sendMessage(_ => {
        wsChannel.send('message...'); // This will wait until the connection open, unless it is already opened
    });
    
    function sendMessage(task) {
        if (!wsChannel || wsChannel.readyState != WebSocketStateEnum.OPEN) {
            msgQueue.push(task);
        } else {
            task();
        }
    
        if (!wsChannel) {
            wsChannel = new WebSocket('ws://your-url');
            wsChannel.onopen = function() {
                while (msgQueue.length > 0) {
                    msgQueue.shift()();
                }
            }
            wsChannel.onmessage = function(evt) {
                // message received here
            }
    
            wsChannel.onclose = function(evt) {
                wsChannel = null;
            }
    
            wsChannel.onerror = function(evt) {
                if (wsChannel.readyState == WebSocketStateEnum.OPEN) {
                    wsChannel.close();
                } else {
                    wsChannel = null;
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-13
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多