JavaScriptとFlash(socketjsのSocketConnect)でリアルタイムチャットを作ってみる

JavaScript, AJAX, Comet, Flash

06:39:02, by dozo Email , 133 words, 12445 views   Japanese (JP) del.icio.us

socketjs( JavaScript + Flash ) = Comet ?

(ノ・・)ン。。。。。。(((●コロコロッ


追記:
こちらもどうぞ。



とりあえずこんなの↓を作った見た。

Realtime chat

Real Time Chat

(鯖会社の撤去命令で閉鎖中)


右側に入力ボックスがあってそれに適当な文字を入力してEnterを押すと、
左側に文字が出てくるという至って簡単なもの。


ブラウザを複数立ち上げると、
別のクライアントIDが割り振られて、
投稿した内容が即座に表示されている。。。はず。

日本語が使えないとか、
動作が緩慢だとかはどうか許して欲しい。
実験なので改良する気はあまり無い。悪しからず。

AJAXは古い技術を集めたものとはいえ、
世間に革命的なインパクトを与えた。
ただ、AJAXの最大の欠点・・・
いや、AJAXの欠点と言うよりWebアプリのジレンマと言うべきか。
それがこれ。

リアルタイム性



例えばチャットやメッセンジャー。
これらをWebアプリで実装しようとしても、
どうしてもリアルタイムにならない。
「更新」ボタンを付けるかぐらいしか思いつかない。
仮想的にAJAX(またはiFrame)で1分に一回ぐらいクロールしてリアルタイムを実現できるかもしれないが、
完全なリアルタイムには絶対ならないし、
無駄なリクエストがほとんどを占めてしまう。

それを実現するのがCometの技術なのだが、
Cometの技術は今のところPHPの出番がない。
そのうちApacheがモジュールを出したりするだろうが、
workerモジュールが使えないPHPにはやはり出番はなさそうだ。

そこで別の実装法としてServer-Sent Event(HTTP Stream)を試してみたが、
うまくいったのかこれ?って言う感じではある。
IEに至っては延々読み込みが止められなかった。
個人的なアプリならともかく実際のサービスに導入するのはできないだろう。


では手詰まり?
かと言えばそうでもなさそうだ。
その他の技術してsocketjsAFLAXといったFlashとJavaScriptのコラボというのがある。

Flash Player5以降にXMLSocketというクラスライブラリが搭載されているのだが、
これがSocket通信を可能にする技術。
socket通信を使用してリアルタイム性を実現する方法だ。
そして各種イベント発生時にJavaScriptを発動させる仕組みになっている。
となれば、後はどうとでも出来るというわけだ。

(・υ・)``ホォー メカラウロコ

これによってブラウザ依存の無い、
リアルタイムAJAXが実現できる。



AFLAX(名前が生命保険会社っぽいな)はもっと総合的なものなのでもっと調査が必要。
今回はソケット通信に特化したsocketjsを使って簡単なチャットアプリを作ってみることにした。
サーバ側をPHP、クライアント側がFlash+JavaScriptという構成。
まぁ、ただ、PHPはやはりこの手のものに使わない方がいい気がしている。
実運用とかがあった時はC#とかで書こうかと。


[More:]

●Socket通信サーバ
Cli版のPHPで実装。
PHPletのライブラリだけ頂いて自前で作成。
ソケット関数、フォーク関数が必要なので、
コンパイル時に下記のオプションを追加しておく。
--enable-pcntl --enable-sockets

あまり参考にはならないと思うが、
ソースも公開しておく。
=>Chat Server PHP
=>chat Server Source

●Socket通信クライアント
socketjsで実装。


さて、socketjsについて少し掘り下げてみよう。
socketjsとは?
Realtime Sockets in Javascript!
The JS-Bridge to Flash' Socket API

FlashのXMLSocketとJavaScriptの橋渡しをしてくれるモジュール。
下記APIとなるJavaScriptコードを自前で作成する。
  • SocketConnect(host,port)
  • SocketSend(data)
  • SocketClose()
  • SocketOnInit()
  • SocketOnConnect(success)
  • SocketOnData(data)
  • SocketOnClose()
各種イベント発生時にこれらのAPIが起動する仕組みだ。
用途はかなりありそう。

こちらはカスタマイズしやすいようにrawデータを公開しよう。
=>socketjs JavaScript Source


ハマリポイント
今回の組み合わせは存外にはまりポイントが多い。
接続するだけで数日を要したぐらいだ。
全部あげたいところだがほとんど忘れた。(汗
●Flash
  • 使用できるポート番号は1024以上
  • Flashが保存してあるサイトのドメイン以外は使用不可
  • 受信する文字列の終端文字は改行ではなくNULL

●JavaScript
  • SocketOnConnectの戻り値はboolenではなくtrue,falseという文字列
  • APIが関数であるためクラス作成が出来ない
  • IEでembed配列が使えないのでFlash用のIDはハードコーディングするしかない

●PHP
  • PHPletのクラスライブラリは未定義のクラスをポンポン呼び出す
  • マルチプロセスだからなのか、ユーザーを複数当てるにもうまく割り当てられない。
  • socketjsのドキュメントには終端文字を"\0\n"と記述してあるが実際は"\n\0"、最終的にはchr(0)を使用


FlashのXMLSocketに関して、
Flash Player7以降で多少緩和されている。
crossdomain.xmlというのを設置することでポート及びドメインの問題は回避できるらしいのだが、
まだ試せていないのが現状。


終端文字がNULLだというのは、
詰まるところ通常のHTTPやFTP通信はこれを使って出来ないようにするためなのだろうか。
あと、直接記述してあるポートに飛ぶためファイアウォールは通せない。
ファイアウォールを通すにはFlash Remotingを使用しなければならないらしい。
ってよくわかってないんだけど。。。
Flash RemotingをPHPで実現するAMFPHPと言うのがあるのだが、
これを調査する必要がありそうだ。
調査でき次第ご報告するとしよう。



以前のSSEよりもこちらの方が実運用に向いている。
リアルタイムにXMLHTTPRequestが使えればいいのだが、
まだまだ調査が必要だ。

Trackback address for this post:

http://hain.jp/htsrv/trackback.php/98

Comments, Trackbacks:

No Comments/Trackbacks for this post yet...

Leave a comment:

Your email address will not be displayed on this site.
Your URL will be displayed.

Allowed XHTML tags: <p, ul, ol, li, dl, dt, dd, address, blockquote, ins, del, span, bdo, br, em, strong, dfn, code, samp, kdb, var, cite, abbr, acronym, q, sub, sup, tt, i, b, big, small>
(Line breaks become <br />)
(Set cookies for name, email and url)
(Allow users to contact you through a message form (your email will NOT be displayed.))
This is a captcha-picture. It is used to prevent mass-access by robots.

Please enter the characters from the image above. (case insensitive)

powered by b2evolution

shinobi

Neighbors
Relative
Favorites
PR

極論istの技術屋を始めて早幾年。 流れの速い業界の波にもまれながらも精一杯生きている様をとくとごらんあれ。

Archives
スポンサー

Latest bookmark
Search

Categories

Who's Online?
Misc
Syndicate this blog XML

Valid XHTML 1.0! Valid CSS! Valid RSS 2.0! Valid Atom 1.0!