2009年12月30日

lite websocket チャットサンプルを更新しました。

以前、ブログで紹介したapache+mod_pywebsocetを用いたliteなwebsocketsチャットサンプルですが、バグフィックスしました。

google code(subversion)上でcommitしておきましたので
$ svn checkout http://html5clock.googlecode.com/svn/trunk/websocketsample somewhere
でチェックアウトできます。

変更点のポイントを以下に列挙します。

python/test_wsh.py

接続情報を送信するようにしました

mod_pywebsocketでは、requestオブジェクトに対し、ws_location, ws_origin, ws_protocol, ws_resourceといったプロパティが定義されています。それらの情報をクライアントに送信するようにしました。
+       def sendConnInfo(self):
+               params = "ws_location : "+str(self.sock.ws_location) + "
" + params += "ws_origin : "+str(self.sock.ws_origin) + "
" + params += "ws_protocol : " + str(self.sock.ws_protocol)+"
" + params += "ws_resource : " + str(self.sock.ws_resource)+"
" + msgutil.send_message(self.sock, params)

threadに対してclose処理を追加しました

チャットのメッセージをハンドリングするために、tailライクな処理をthreadで処理しているのですが、こちらの終了処理の定義を追加しました(状態変数をglobalに_status_として定義しています)。以前のコードだと、接続がおかしくなるケースが稀に発生していたのですが、こちらのスレッドがゾンビ化していたためかもしれません(threadでもゾンビといっていいのかよく分かりませんが)
+                       if _status_ != _OPEN_:
+                               msgutil.send_message(self.sock, "status = "+str(_status_))
+                               break

heartbeatに対応

無通信状態だと、apacheの設定により勝手にコネクションが切られてしまうため、クライアントから60秒おきに"Heartbeat"を送信する仕様としました。このメッセージのハンドリング(無視するだけ:p)を定義しています。
+                       if line == _HEARTBEAT_:
+                               continue

html/sample.html

こちらは、煩雑になるのでdiffの表示は省略。以下に変更点のみ列挙
  • disconnectボタンを配置(ws.close())
  • Heartbeatを60秒おきに送信(apacheが自動で切断するのを防ぐ)
  • window.onunload=function(){ws.close();}を追加(リロード時などにコネクションが残るのを防ぐ


人気ブログランキングへ
kotesaki at 17:00│Comments(0)TrackBack(0)clip!html5 | websockets

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔