bxdxmx3

きじれてじろあ なきがせすで あぷせとねでぶ

IP MessengerってLAN環境でしか動かないの?じゃあインターネットで使えるの作っちゃえば良いじゃん

てなわけで作ってみた。
本家のIPMessangerとは外見が同じなだけで中身は全然違うけど。

f:id:eo-oe-aaaa:20100220183129p:image

システム概要

単純なC/Sで構築。
サーバー側は誰に何を送るかなどを捌くだけ。

実装

言語:C# 3.5
UI:WPF
通信:WCF

通信

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って本当にすばらしいものですね。

参考にした本