【问题标题】:Getting event when new data can be read - chrome.socket.read API可以读取新数据时获取事件 - chrome.socket.read API
【发布时间】:2013-01-07 09:34:43
【问题描述】:

尝试在 Chrome 25.0.1364.5 开发版上使用chrome.socket API 使用 TCP 套接字。

查看documentationchrome.socket.read 似乎没有办法在有新数据可供读取时获得通知。

有一些sample code 用于 TCP 服务器,它每 500 毫秒轮询一次读取命令,但我认为这不会有效/准确

// Start polling for reads.
setInterval(this._periodicallyRead.bind(this, socketId), 500);

更令人困惑的是,在“接收数据”部分下的'Network Communications' Documentation 中,指出可以在chrome.socket.create 中将特殊处理程序作为onEvent 选项传递

参数是一个具有一个值“onEvent”的对象,它是对方法的函数引用,当端口上有数据可用时将调用该方法。

这个onEvent参数会这样使用

chrome.socket.create(
    'udp', '127.0.0.1', 1337, 
    { onEvent: handleDataEvent }, // <-- call this when new data is available
    createHandler
)

但这似乎仅适用于 UDP 连接,因为当我尝试使用它时出现以下错误

Error: Invocation of form 
       socket.create(string, string, integer, object, function) 
       doesn't match definition 
       socket.create(string type, optional object options, function callback)

        at Object.normalizeArgumentsAndValidate (schemaUtils:119:11)
        at Object.<anonymous> (schema_generated_bindings:301:32)
        at chrome-extension://obljaojhdffbpcdfbeoiejegaodfoonp/background.js:11:15
        at chrome.Event.dispatchToListener (event_bindings:387:21)
        at chrome.Event.dispatch_ (event_bindings:373:27)
        at dispatchArgs (event_bindings:249:22)
        at Object.app.runtime.onLaunched (app.runtime:116:7)
        at Object.chromeHidden.Event.dispatchEvent (event_bindings:255:35) 

所以问题是,这样的事情可以通过 TCP Connections 来实现吗?不必每 x 毫秒轮询一次 read 方法?

更新

这是我正在使用的解决方法,直到存在更好的文档/事件支持。

function onReadHandler(readInfo) {
     // do things with data
     // ....

     // re register handler with callback itself
     chrome.socket.read(socketId,null,onReadHandler);         
}

chrome.socket.read(socketId,null,onReadHandler);

【问题讨论】:

  • onEvent: 是否不适用于 tcp 套接字?
  • 它会抛出一个错误,说它需要不同类型的参数。我已经用跟踪更新了这个问题
  • “网络通信”页面和actual API docs 似乎不同步——API 文档中没有提到onEvent。此外,API 讨论了callback 参数,但没有指定套接字函数接受回调。文档现在看起来有点乱。
  • 我用解决方法更新了这个问题,以防有人感兴趣
  • @lostsource - 我很好奇你的解决方法:这会导致空读吗?或者只有当 Chrome 有一些非空缓冲区要给回调时才会触发回调?

标签: javascript sockets google-chrome-extension google-chrome-app


【解决方案1】:

对于 TCP 连接,传递给 socket.read 的回调只有在有新数据可用时才会执行。 sample code mentioned 已修复为仅使用回调而不是 setInterval。

网络文档确实已经过时,我们正在努力更新它。如果您想在 API 快速变化的这些日子避免文档过时的风险,您应该始终检查 API reference docs - 这些是直接从代码生成的,不需要编辑工作。如果你觉得“hacky”:-) 你也可以直接看 Chromium source code API definitions (this one is for the socket API)

最后但同样重要的是,对于Sublime Text 用户,有一个Sublime Chrome Apps and Extensions plugin。它还没有完成,但您已经可以获得代码完成、CSP 验证和一些用于引导的样板。通过 Sublime Package Manager 安装它。

【讨论】:

  • 感谢您提供的信息和链接。我恰好是 Sublime Text 用户,因此该插件肯定会很有用。最后一个问题,我发布的代码 (onReadHandler) 有什么根本错误吗?我应该切换到 setInterval 方法
  • 我要重申 setInterval 的性能会更好,但后来我决定检查一下。感谢 Chrome Dev Tools Timeline 选项卡,我刚刚发现您使用的方法实际上更好。 socket.read 方法在有新数据可用之前不会调用回调,因此永远不会发生忙等待。我将使用您的方法更新示例,谢谢! :-)(也会在这里更新答案)
  • 太好了,感谢您的再次保证。我只是怀疑回调的“重新注册”是否应该在处理数据之后(现在这样)或之前(回调中的第一行)发生
  • 没有区别,因为您的代码是单线程的,并且在您处理消息时接收到的数据无论如何都会保存在读取缓冲区中。
  • 谢谢@mangini。 UDP 套接字呢?是否适用相同的原则,即。只有当数据可供读取时才调用回调?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2018-10-08
相关资源
最近更新 更多