4

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

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

TCP 服务器有一些示例代码,它每 500 毫秒轮询一次读取命令,但我认为这不会高效/准确

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

更令人困惑的是,在“接收数据”部分下的“网络通信”文档中,声明可以将特殊处理程序作为onEvent选项传递chrome.socket.create

该参数是一个具有一个值“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 来实现吗?read而不是必须每 x 毫秒轮询一次方法?

更新

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

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);
4

1 回答 1

3

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

网络文档确实已经过时,我们正在努力更新它。如果您想在 API 快速变化的今天避免文档过时的风险,您应该始终检查API 参考文档——这些文档是直接从代码生成的,不需要编辑工作。如果你觉得“hacky”:-) 你也可以直接查看 Chromium源代码 API 定义这个是针对套接字 API 的

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

于 2013-01-09T21:26:14.133 回答