2009年12月30日
lite websocket チャットサンプルを更新しました。
以前、ブログで紹介したapache+mod_pywebsocetを用いたliteなwebsocketsチャットサンプルですが、バグフィックスしました。
google code(subversion)上でcommitしておきましたので
人気ブログランキングへ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();}を追加(リロード時などにコネクションが残るのを防ぐ