Google Chrome開発版でsocket APIを試す

Google Chromeの開発版で、拡張機能APIにソケット通信が追加されたそうだ。ネットワークプログラミングマニアとして、早速ドキュメントを読んでみた。

しかし、参考ページにあるサンプルコード通りには動かなかったので、ドキュメントとエラーメッセージを見ながら実際に動くものを作ってみた。ちなみに、experimental.socket.htmlはドキュメントのどこからもリンクが張られていないので、まだ本当に実験段階の「使われるレベルにない」APIのようだ。

動作環境としてGoogle Chrome 21.0.1137.1 canary (Windows/Mac)を用いた。

まず、拡張機能でexperiment APIを使えるように、chrome://flagsの設定を変更し、再起動する。

次に、manifest.json"permissions": ["experimental"]を記述した拡張機能を作り、Chrome拡張機能管理画面から読み込む。

拡張機能のソースに同梱したtcpserver.pyudpserver.pyは単純なTCP/UDPソケットサーバの実装になっている。あらかじめ、Google Chromeが起動しているマシンで動かしておく。

拡張機能管理画面に表示されたこの拡張機能background.htmlのInspect views (Developer tools)を開く。JavaScriptコンソールでexperimental.socket.*を使ったコードを書いてテストする。

ドキュメントにはsocket-typeとして'udp'で無ければならないとあるので、UDP通信のみをテストした ('tcp'を指定することも出来るようだが、通信を確認できなかった) 。

また、chrome.experimental.socket.write(..)の第2引数がstringとあるが、文字列を入れるとエラーになったため、APIのテストコードを参照し、文字列をArrayBufferに変換したデータを渡している。


// JavaScriptコンソール上で

> udp_socket_writer("127.0.0.1", 9998, "hello")
undefined
  ▼Object
    bytesWritten: 5

> udp_socket_writer("127.0.0.1", 9998, "こんにちは、そけっと")
undefined
  ▼Object
    bytesWritten: 30
$ python udpserver.py  # ターミナル上でUDPサーバが動作している
('127.0.0.1', 62019) wrote: hello
('127.0.0.1', 51649) wrote: こんにちは、そけっと

UDPサーバにデータが送られていることを確認できた。逆にChrome側をサーバとして動作させることも出来るらしい。Webブラウザ同士のP2P通信実装も夢ではない。

TCP通信が出来るようになったら、IRCクライアントを書きたい。