4

試圖在Chrome版本25.0.1364.5開發版中使用chrome.socket API使用TCP套接字。獲取可讀取新數據的事件 - chrome.socket.read API

chrome.socket.readdocumentation似乎沒有辦法在新數據可讀取時得到通知。

有一些sample code因爲我覺得這輪詢讀命令每500ms,但是這不會是有效的TCP服務器/準確

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

更重要的是混亂的是,在部分之下'Network Communications' Documentation「接收數據」中,記載的是一種特殊的處理程序可以作爲一個onEvent選項chrome.socket.create

傳遞的參數是一個值的對象「的onEvent」是一個函數參照方法將被調用時的DAT a在港口上可用。

此的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連接可以實現這樣的事情嗎?而不必每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); 
+0

'onEvent:'不適用於'tcp'套接字嗎? – Sudarshan

+0

它會拋出一個錯誤,說它期望不同類型的參數..我已更新跟蹤 – lostsource

+0

「網絡通信」頁面和[實際API文檔](http://developer.chrome.com/apps /socket.html)似乎不同步 - 在API文檔中沒有提及'onEvent'。此外,API會討論'callback'參數,但是沒有一個套接字函數被指定爲接受回調。這些文檔現在看起來有些混亂。 – apsillers

回答

3

對於TCP連接,傳遞給socket.read回調將只當有新的數據可用來執行。 sample code mentioned被修復爲只使用回調代替setInterval。

網絡文檔確實已過時,我們正在努力更新它。如果您想在快速更改API的這些日子裏避免過期文檔的風險,您應該始終檢查API reference docs - 這些代碼是直接從代碼生成的,不需要編輯工作。如果你感到「哈克」 :-)你也可以在鉻source code API definitionsthis one is for the socket API)直視

最後,但並非最不重要的,對於Sublime Text用戶,有一個Sublime Chrome Apps and Extensions plugin。它還沒有完成,但你已經可以獲得代碼完成,CSP驗證和一些引導文件。通過Sublime Package Manager安裝它。

+1

感謝您的信息和鏈接..我碰巧是一個Sublime Text用戶,所以這個插件一定會很有用。最後一個問題,我發佈的代碼(onReadHandler)有什麼根本錯誤?我應該切換到setInterval方法 – lostsource

+0

我要重申,setInterval會更好的性能,但後來我決定檢查它。感謝Chrome Dev Tools Timeline選項卡,我發現您使用的方法實際上更好。在新數據可用之前,socket.read方法不會調用回調函數,那麼繁忙的等待就不會發生。我會用你的方法更新樣本,謝謝! :-)(並會在這裏更新答案) – mangini

+0

太好了,謝謝你的再次保證。我只有一個疑問,如果在處理數據(如現在)或之前(回調的第一行)之後應該發生回調的「重新註冊」 – lostsource