如何在 webworkers 中访问 websockets?

Posted

技术标签:

【中文标题】如何在 webworkers 中访问 websockets?【英文标题】:How can access websockets in webworkers? 【发布时间】:2012-08-08 05:42:57 【问题描述】:

我需要从 webworkers 发送 websocket 调用,我怎样才能得到它。我不认为用户代理有任何支持。如果有支持,请给我一个例子。

我正在尝试的示例。

var ws = new WebSocket(url);
var worker=new Worker(worker.js);

ws.onmessage=function(e)
worker.postMessage(ws:ws,data:e.data);

worker.js

onmessage=function(e)
  var ws=e.data.ws;
  var data=e.data.data;
  var request=someProcess(data);

  ws.send(request);

【问题讨论】:

当我尝试这样做时得到 DOM 异常。 worker.postMessage 返回错误。 【参考方案1】:

在 worker 中 ws 是一个 string 反序列化的 JSON 对象,而不是 WebSocket 对象。您不能将带有方法的对象传递给工作人员,这意味着工作人员需要回复主线程,而主线程执行ws.send(worker_response)

我怀疑您收到的错误是 DATA_CLONE_ERR 异常或类似情况,因为 WebSocket 对象不能通过 structured clone algorithm 进行 JSON 序列化。

【讨论】:

来自这个讨论(***.com/questions/10886910/…)。我收到评论“您可以通过 Chrome 中的 Web Workers 使用 WebSockets,并且有一个 Mozilla 错误来在 Firefox 中实现对此的支持:bugzilla.mozilla.org/show_bug.cgi?id=504553 – kanaka”。然后说can,t we send requests from worker to websockets. 我同意你的观点,但我怀疑是否真的可以发送请求 这与您是否可以在工作人员中使用 websocket 无关。我的意思是对象e.data.ws不是websocket 对象,因此没有send() 方法。那么e.data.ws 是什么?它是一个反序列化的 JSON 对象,它是从 WebSocket 对象创建的,但根据 JSON 数据@developer.mozilla.org/en-US/docs/DOM/Using_web_workers 下的注释不包含任何函数。具体来说:“传入和传出 worker 的对象不得包含函数或循环引用,因为 JSON 不支持这些。” 你不能把整个websocket 只保留在webworker 中吗?然后将websocket 操作(聊天,随便)作为json 传递回jQuery?这可能吗? 更新:2015 年 5 月 12 日 Firefox 38 允许在 Web Worker 中使用 WebSocket。

以上是关于如何在 webworkers 中访问 websockets?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Android Webview(使用 CSP)上为 WebWorker 启用 fileuri 访问?

如何使用 webworks 在 Blackberry 10 设备中获取 IMEI 号码?

如何在 JavaScriptCore 中将新的原生类添加到 WebWorker 的上下文中?

浅谈webWorker

Webwork 学习之路文件上传下载

webWorker