【发布时间】:2013-01-07 09:34:43
【问题描述】:
尝试在 Chrome 25.0.1364.5 开发版上使用chrome.socket API 使用 TCP 套接字。
查看documentation 的chrome.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