Chrome打包应用UDP套接字无法正常工作

Ash*_*ain 1 javascript sockets google-chrome google-chrome-extension google-chrome-app

我正在尝试使用Chrome Canary(目前的版本25)为一个打包的应用程序提供UDP套接字.我很困惑这里UDP示例这里参考文档冲突.

官方示例使用此行:

chrome.socket.create('udp', '127.0.0.1', 1337, { onEvent: handleDataEvent }, ...
Run Code Online (Sandbox Code Playgroud)

在Canary中使用此行会导致错误:

未捕获错误:调用表单socket.create(字符串,字符串,整数,对象,函数)与定义socket.create(字符串类型,可选对象选项,函数回调)不匹配

这并不奇怪,因为它符合函数的记录形式.(我猜这个例子已经过时了?)好的,我试试这个......

chrome.socket.create('udp', { onEvent: handleDataEvent }, ...
Run Code Online (Sandbox Code Playgroud)

金丝雀抱怨:

未捕获的错误:参数2的值无效.属性'onEvent':意外的属性.

现在我很困惑,特别是因为这个参数在引用中没有记录.所以我就这样说:

chrome.socket.create('udp', {}, ...
Run Code Online (Sandbox Code Playgroud)

现在它创建好了,但是以下调用connect...

chrome.socket.connect(socketId, function(result) ...
Run Code Online (Sandbox Code Playgroud)

......失败了:

未捕获错误:调用表单socket.connect(整数,函数)与定义socket.connect(整数socketId,字符串主机名,整数端口,函数回调)不匹配

...这并不奇怪,因为现在我的代码没有在任何地方提到主机或端口,所以我想它需要进入connect.所以我将其更改为以下形式:

chrome.socket.connect(socketId, address, port, function (result) ...
Run Code Online (Sandbox Code Playgroud)

最后我可以连接并写入套接字OK.但这并不包括阅读.

  • 有人能告诉我一个基于UDP的可以发送和接收的工作示例,所以我可以从中工作吗?
  • 我如何接收数据,因为示例的onEvent处理程序不起作用?如何在没有阻止的情况下尽快收到任何数据?

方 觉*_*方 觉 8

网络通信文档不是最新的.请参阅最新的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 :(% 5E%7C/)net/ UDP/UDP_SOCKET%5C.h $&exact_package =铬

// 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.
Run Code Online (Sandbox Code Playgroud)

对于服务器UDP套接字,调用chrome.socket.bindchrome.socket.recvFrom/ chrome.socket.sendTo与客户端进行交互.对于客户端UDP套接字,调用chrome.socket.connectchrome.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);
    });
});
Run Code Online (Sandbox Code Playgroud)