Adsense_top

2009年8月18日火曜日

C# Twitter API ストリーム系に挑戦してみる

久しぶりに書くことが出来ました。
Twitter API にβらしいのですが、ストリーム系のものがあります。
リアルタイムにフォローしたりすることが出来ます。Twitterらしい機能ですので、書いてみました。
MSDNのサンプルを参考にしました。


先ずはクラス変数とイベント



public event ReceiveEventHandler Received;
RequestState state = null;
public delegate void ReceiveEventHandler(string result);

ワーカースレッドとして呼び出すメソッドです。



private void Execute(object obj)
{
// 引数オブジェクトを実際の型にキャスト
// ArgsObjectクラスについては後述します。
ArgsObject args = (ArgsObject)obj;
// ワーカースレッドでエラーを処理しないと
// プログラム自体が落ちてしまうため処理は必須
try
{
StringBuilder paramBuilder = new StringBuilder();
foreach (string param in args.Parameters)
{
if (paramBuilder.Length > 0)
paramBuilder.Append("&");
paramBuilder.Append(param);
}
HttpWebRequest request =
(HttpWebRequest)WebRequest.Create(args.Url);
System.Net.ServicePointManager.Expect100Continue = false;
request.Method =
Enum.GetName(typeof(HttpMethod), args.Method);
request.ContentType =
"application/x-www-form-urlencoded";
request.Credentials =
new NetworkCredential(args.UserId, args.Password);
// 非同期動作で使用する状態オブジェクト
state = new RequestState(args.BufferSize);
state.Request = request;

StreamWriter writer =
new StreamWriter(request.GetRequestStream());
if (paramBuilder.Length > 0)
writer.Write(paramBuilder.ToString());
writer.Close();

// 非同期要求
IAsyncResult iAasyncResult =
(IAsyncResult)request.BeginGetResponse(
new AsyncCallback(ResponseCallback), state);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}

レスポンス受信



private void ResponseCallback(IAsyncResult ar)
{
try
{
// 非同期要求用状態オブジェクト
RequestState state = (RequestState)ar.AsyncState;
HttpWebRequest request = state.Request;
state.Response =
(HttpWebResponse)request.EndGetResponse(ar);
// ストリームから読み込む
Stream stream = state.Response.GetResponseStream();
state.Stream = stream;
// 非同期読み込み開始
IAsyncResult iAsyncResult =
stream.BeginRead(
state.Buffer, 0, state.BufferSize,
new AsyncCallback(ReadCallBack), state);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}

レスポンスのデータの読み込み



private void ReadCallBack(IAsyncResult ar)
{
try
{
RequestState state = (RequestState)ar.AsyncState;
// 非同期読み込み(待機)
Stream stream = state.Stream;
int read = stream.EndRead(ar);
if (read > 0)
{
state.StringValue.Append(
Encoding.ASCII.GetString(state.Buffer, 0, read));
if (state.StringValue.Length > 1)
{
string stringContent =
state.StringValue.ToString();
// 受信イベントを
OnReciveded(stringContent);
state.DataClear();
}
IAsyncResult iAsyncResult =
stream.BeginRead(state.Buffer, 0, state.BufferSize,
new AsyncCallback(ReadCallBack), state);
}
else
{
if (state.StringValue.Length > 1)
{
string stringContent = state.StringValue.ToString();
OnReciveded(stringContent);
state.DataClear();
}
stream.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}

今回も出来るだけ簡潔に書くように心がけましたので、結構な手抜きになっています。

長くなって来ましたので、今回書き残したメソッドの中で使われている、クラスやメソッドと使用方法は次回(明日か明後日)に分けて書くことにします。


0 件のコメント:

コメントを投稿