1

Chrome Canary (現在のバージョン 25) を使用して、パッケージ化されたアプリで UDP ソケットを動作させようとしています。ここにあるUDP の例が、ここにあるリファレンス ドキュメントと競合するという事実にかなり混乱しています。

公式の例では、次の行を使用しています。

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

Canary でこの行を使用すると、エラーが発生します。

キャッチされないエラー: フォーム socket.create(string, string, integer, object, function) の呼び出しが定義 socket.create(string type, optional object options, function callback) と一致しません

文書化された関数の形式と一致するため、驚くことではありません。(この例は時代遅れだと思いますか?) OK、これを試してみます...

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

カナリアは次のように不満を述べています。

キャッチされないエラー: 引数 2 の値が無効です。プロパティ 'onEvent': 予期しないプロパティです。

特にこのパラメーターはリファレンスに記載されていないため、今は混乱しています。だから私はこれで行きます:

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

これで OK が作成されますが、次の呼び出しはconnect...

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

...これで失敗します:

キャッチされないエラー: フォーム socket.connect(integer, function) の呼び出しが定義 socket.connect(integer socketId, string hostname, integer port, function callback) と一致しません

...これは驚くべきことではありません。私のコードはどこにもホストやポートについて言及していないので、connect. したがって、次の形式に変更します。

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

やっとソケットに接続して書き込みができてOK。しかし、これは読書をカバーしていません。

  • 送受信できるUDPに基づいた実際の例を誰かに見せてもらえますか?
  • サンプルの onEvent ハンドラが機能しないため、データを受け取るにはどうすればよいですか? データが到着したらすぐにブロックせずにオンデマンドで確実に受け取るにはどうすればよいですか?
4

1 に答える 1

8

Network Communications のドキュメントは最新ではありません。最新の 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.

サーバー UDP ソケットの場合、chrome.socket.bindand chrome.socket.recvFrom/chrome.socket.sendToを呼び出してクライアントと対話します。クライアント UDP ソケットの場合は、chrome.socket.connectand 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);
    });
});
于 2012-12-04T04:57:02.667 に答える