IP MessengerってLAN環境でしか動かないの?じゃあインターネットで使えるの作っちゃえば良いじゃん
てなわけで作ってみた。
本家のIPMessangerとは外見が同じなだけで中身は全然違うけど。
システム概要
単純なC/Sで構築。
サーバー側は誰に何を送るかなどを捌くだけ。
通信
BasicHttpBindingの非同期通信でCometぽい処理をすることで、
サーバーからのプッシュ処理を実現。
※当初はWSDualHttpBindingのコールバックオブジェクトを
サーバー側で保持することで実現しようと思っていたが、
会社のファイアーウォールを超えられないことが発覚したので変更。
BasicHttpBindingならば普通にインターネットが繋がる環境ならどこでも使える。
擬似Comet処理実装方法
抜粋するとこんな感じ。
public object Comet( string id ) { var queue = userCometQueue[id]; lock (queue) { while (queue.Count <= 0 ) { try { Monitor.Wait(queue); } catch (Exception ex) { } } return queue.Dequeue(); } }
private void Send(string fromID, string toID, string text) { CometData data = CometData.CreateReceive(fromID, userList[fromID].Name, text); var queue = userCometQueue[id]; lock (queue) { queue.Enqueue(data); Monitor.Pulse(queue); } }
クライアント側で予めCometを非同期で呼び出す。
サーバー側はQueueをJavaのBlockingQueueのように使用する。
デザインパターンのGuarded Suspensionパターンですね。
クライアント側にプッシュ処理を行いたい場合にMonitor.Pulse(queue)とやることで、
非同期処理の終了、キューのデータを返す。
クライアント側は受け取ったデータに応じて、何らかの処理を行う。
作ってみて
いやーWCFって本当にすばらしいものですね。
参考にした本