最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Chrome packaged app UDP sockets not working - Stack Overflow

programmeradmin1浏览0评论

I'm trying to get UDP sockets working for a packaged app using Chrome Canary (currently version 25). I am pretty confused by the fact the UDP example here conflicts with the reference documentation here.

The official example uses this line:

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

In Canary using this line results in the error:

Uncaught Error: Invocation of form socket.create(string, string, integer, object, function) doesn't match definition socket.create(string type, optional object options, function callback)

Not surprising since that matches the documented form of the function. (I guess the example is out of date?) OK, so I try this...

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

Canary plains:

Uncaught Error: Invalid value for argument 2. Property 'onEvent': Unexpected property.

Now I'm confused, especially since this parameter is undocumented in the reference. So I just go with this:

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

Now it creates OK, but the following call to connect...

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

...fails with this:

Uncaught Error: Invocation of form socket.connect(integer, function) doesn't match definition socket.connect(integer socketId, string hostname, integer port, function callback)

...which is not surprising, since now my code doesn't mention a host or port anywhere, so I guess it needs to be in connect. So I change it to the form:

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

At last I can connect and write to the socket OK. But this doesn't cover reading.

  • Can someone show me a working example based on UDP that can send & receive, so I can work from that?
  • How do I receive data since the example's onEvent handler does not work? How do I ensure I receive any data on-demand as soon as it arrives without blocking?

I'm trying to get UDP sockets working for a packaged app using Chrome Canary (currently version 25). I am pretty confused by the fact the UDP example here conflicts with the reference documentation here.

The official example uses this line:

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

In Canary using this line results in the error:

Uncaught Error: Invocation of form socket.create(string, string, integer, object, function) doesn't match definition socket.create(string type, optional object options, function callback)

Not surprising since that matches the documented form of the function. (I guess the example is out of date?) OK, so I try this...

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

Canary plains:

Uncaught Error: Invalid value for argument 2. Property 'onEvent': Unexpected property.

Now I'm confused, especially since this parameter is undocumented in the reference. So I just go with this:

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

Now it creates OK, but the following call to connect...

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

...fails with this:

Uncaught Error: Invocation of form socket.connect(integer, function) doesn't match definition socket.connect(integer socketId, string hostname, integer port, function callback)

...which is not surprising, since now my code doesn't mention a host or port anywhere, so I guess it needs to be in connect. So I change it to the form:

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

At last I can connect and write to the socket OK. But this doesn't cover reading.

  • Can someone show me a working example based on UDP that can send & receive, so I can work from that?
  • How do I receive data since the example's onEvent handler does not work? How do I ensure I receive any data on-demand as soon as it arrives without blocking?
Share Improve this question asked Dec 3, 2012 at 20:27 AshleysBrainAshleysBrain 22.6k16 gold badges91 silver badges125 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 8

The Network Communications doc is not up-to-date. See the latest API doc: https://developer.chrome./trunk/apps/socket.html. But the doc doesn't state everything clearly. I looked into Chromium source code and found some useful ments here: https://code.google./searchframe#OAMlx_jo-ck/src/net/udp/udp_socket.h&q=file:(%5E%7C/)net/udp/udp_socket%5C.h$&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 e from a different client
//                           // Writes need to be directed to a specific
//                           // address.

For the server UDP socket, call chrome.socket.bind and chrome.socket.recvFrom/chrome.socket.sendTo to interact with clients. For the client UDP socket, call chrome.socket.connect and chrome.socket.read/chrome.socket.write to interact with the server.

Here's an example:

var serverSocket;
var clientSocket;

// From https://developer.chrome./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./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);
    });
});
发布评论

评论列表(0)

  1. 暂无评论