UDP-сокеты пакетного приложения Chrome не работают

Я пытаюсь заставить сокеты UDP работать с упакованным приложением, используя Chrome Canary (в настоящее время версия 25). Меня очень смущает тот факт, что приведенный здесь пример UDP конфликтует с справочная документация здесь.

Официальный пример использует эту строку:

chrome.socket.create('udp', '127.0.0.1', 1337, { onEvent: handleDataEvent }, ...

В Canary использование этой строки приводит к ошибке:

Неперехваченная ошибка: вызов формы socket.create(строка, строка, целое число, объект, функция) не соответствует определению socket.create(тип строки, необязательные параметры объекта, обратный вызов функции)

Неудивительно, поскольку это соответствует задокументированной форме функции. (Наверное, пример устарел?) Хорошо, попробую так...

chrome.socket.create('udp', { onEvent: handleDataEvent }, ...

Канарейка жалуется:

Неперехваченная ошибка: недопустимое значение для аргумента 2. Свойство onEvent: непредвиденное свойство.

Теперь я запутался, тем более что этот параметр недокументирован в справочнике . Поэтому я просто иду с этим:

chrome.socket.create('udp', {}, ...

Теперь он создает OK, но следующий вызов connect...

chrome.socket.connect(socketId, function(result) ...

... терпит неудачу с этим:

Неперехваченная ошибка: вызов формы socket.connect (целое число, функция) не соответствует определению socket.connect (целое число socketId, строковое имя хоста, целочисленный порт, обратный вызов функции)

... что неудивительно, так как теперь мой код нигде не упоминает хост или порт, поэтому я думаю, что он должен быть в connect. Поэтому я изменяю его на форму:

chrome.socket.connect(socketId, address, port, function (result) ...

Наконец-то я могу подключиться и написать в сокет ОК. Но это не относится к чтению.

  • Может ли кто-нибудь показать мне рабочий пример на основе UDP, который может отправлять и получать, чтобы я мог работать с ним?
  • Как получить данные, если обработчик onEvent в примере не работает? Как обеспечить получение любых данных по запросу, как только они поступят без блокировки?

person AshleysBrain    schedule 03.12.2012    source источник


Ответы (1)


Документ по сетевым коммуникациям устарел. См. последний документ по API: https://developer.chrome.com/trunk/apps/socket.html. Но документ не говорит все ясно. Я просмотрел исходный код Chromium и нашел несколько полезных комментариев здесь: https://code.google.com/searchframe#OAMlx_jo-ck/src/net/udp/udp_socket.h&q=file%3a%28%5E%7C/%29net/udp/udp_socket%5C.h%24&exact_package=chromium

// Client form:
// In this case, we're connecting to a specific server, so the client will
// usually use:
//       Connect(address)    // Connect to a UDP server
//       Read/Write          // Reads/Writes all go to a single destination
//
// Server form:
// In this case, we want to read/write to many clients which are connecting
// to this server.  First the server 'binds' to an addres, then we read from
// clients and write responses to them.
// Example:
//       Bind(address/port)  // Binds to port for reading from clients
//       RecvFrom/SendTo     // Each read can come from a different client
//                           // Writes need to be directed to a specific
//                           // address.

Для сокета UDP сервера вызовите chrome.socket.bind и chrome.socket.recvFrom/chrome.socket.sendTo для взаимодействия с клиентами. Для клиентского сокета UDP вызовите chrome.socket.connect и chrome.socket.read/chrome.socket.write для взаимодействия с сервером.

Вот пример:

var serverSocket;
var clientSocket;

// From https://developer.chrome.com/trunk/apps/app_hardware.html
var str2ab=function(str) {
  var buf=new ArrayBuffer(str.length);
  var bufView=new Uint8Array(buf);
  for (var i=0; i<str.length; i++) {
    bufView[i]=str.charCodeAt(i);
  }
  return buf;
}

// From https://developer.chrome.com/trunk/apps/app_hardware.html
var ab2str=function(buf) {
  return String.fromCharCode.apply(null, new Uint8Array(buf));
};

// Server
chrome.socket.create('udp', null, function(createInfo){
    serverSocket = createInfo.socketId;

    chrome.socket.bind(serverSocket, '127.0.0.1', 1345, function(result){
        console.log('chrome.socket.bind: result = ' + result.toString());
    });

    function read()
    {
        chrome.socket.recvFrom(serverSocket, 1024, function(recvFromInfo){
            console.log('Server: recvFromInfo: ', recvFromInfo, 'Message: ', 
                ab2str(recvFromInfo.data));
            if(recvFromInfo.resultCode >= 0)
            {
                chrome.socket.sendTo(serverSocket, 
                    str2ab('Received message from client ' + recvFromInfo.address + 
                    ':' + recvFromInfo.port.toString() + ': ' + 
                    ab2str(recvFromInfo.data)), 
                    recvFromInfo.address, recvFromInfo.port, function(){});
                read();
            }
            else
                console.error('Server read error!');
        });
    }

    read();
});

// A client
chrome.socket.create('udp', null, function(createInfo){
    clientSocket = createInfo.socketId;

    chrome.socket.connect(clientSocket, '127.0.0.1', 1345, function(result){
        console.log('chrome.socket.connect: result = ' + result.toString());
    });

    chrome.socket.write(clientSocket, str2ab('Hello server!'), function(writeInfo){
        console.log('writeInfo: ' + writeInfo.bytesWritten + 
            'byte(s) written.');
    });

    chrome.socket.read(clientSocket, 1024, function(readInfo){
        console.log('Client: received response: ' + ab2str(readInfo.data), readInfo);
    });
});
person 方 觉    schedule 04.12.2012