4

Попытка использования сокетов TCP с использованием chrome.socket API в Chrome Версия 25.0.1364.5 dev.Получение события, когда новые данные могут быть прочитаны - chrome.socket.read API

Означает, что documentation для chrome.socket.read не представляется возможным получить уведомление, когда новые данные доступны для чтения.

Существует несколько sample code для сервера TCP, который опрашивает команду чтения каждого 500мс, но я думаю, что это не будет эффективным/точный

// 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 Connections? Вместо того, чтобы опросить метод read каждые x миллисекунд?

Update

Это обходной путь я использую до лучшей поддержки документации/событие не существует.

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

does '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 - они генерируются непосредственно из кода и не нуждаются в редакционной работе. Если вы чувствуете «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.

+1

спасибо за информацию и ссылки .. Я оказался пользователем Sublime Text, так что плагин определенно будет полезен. Последний вопрос, есть ли что-то принципиально неправильное с кодом, который я опубликовал (onReadHandler)? я должен переключиться на метод setInterval – lostsource

+0

Я собирался повторить, что setInterval будет лучше для производительности, но потом я решил проверить его. Благодаря вкладке Timeline Chrome Tools Tools, я только узнал, что метод, который вы использовали, на самом деле лучше. Метод socket.read не вызывает обратный вызов до тех пор, пока не появятся новые данные, тогда ожидание ожидания не произойдет. Я буду обновлять образец, используя ваш метод, спасибо! :-) (и здесь будет обновлен ответ) – mangini

+0

отлично, спасибо за повторное заверение. У меня есть только одно сомнение в том, что «перерегистрация» обратного вызова должна произойти после работы с данными (как сейчас) или раньше (первая строка в обратном вызове) – lostsource

Смежные вопросы