04

13

F#プログラミングメモ #3

2011.04.13(23:52)

私も同期版と非同期版のHTTPクライアントを書いてみた。洗練はこれから。


// FSharp-2.0.0.0
open System.IO;;
open System.Net;;

let getTitle (html : string) =
let startPos = html.IndexOf("<title>")+7 in
let endPos = html.IndexOf("</title>") in
let title = html.Substring(startPos, endPos - startPos) in
title;;

// 同期版
let SyncHttp (url:string) =
let req = WebRequest.Create(url)
#if use_proxy
req.Proxy <- new WebProxy("http://10.0.xx.xx:8080")
#endif
use rsp = req.GetResponse() in
use stream = rsp.GetResponseStream() in
use reader = new StreamReader(stream) in
let html = reader.ReadToEnd() in
getTitle(html) |> printfn "SyncHttp [%s]";;

let pages =
[|
SyncHttp "http://www.google.co.jp/";
SyncHttp "http://news.google.co.jp/nwshp?hl=ja&tab=wn";
SyncHttp "http://www.yahoo.co.jp/";
|];;

// 非同期版
type System.Net.WebRequest with
member x.GetResponseAsync() =
Async.FromBeginEnd(x.BeginGetResponse, x.EndGetResponse)

let AsyncHttp (url:string) =
async { let req = WebRequest.Create(url) in
#if use_proxy
req.Proxy <- new WebProxy("http://10.0.xx.xx:8080")
#endif
let! rsp = req.GetResponseAsync() in
use stream = rsp.GetResponseStream() in
use reader = new StreamReader(stream) in
let html = reader.ReadToEnd() in
getTitle(html) |> printfn "AsyncHttp [%s]"
};;

let Sleeping n =
async { do! Async.Sleep(n)
printfn "timeount %d ms" n
};;

Async.RunSynchronously ( AsyncHttp "http://www.google.com"; )

Async.RunSynchronously ( Async.Parallel [ Sleeping(2000);
AsyncHttp "http://www.google.com";
AsyncHttp "http://news.google.co.jp/nwshp?hl=ja&tab=wn";
AsyncHttp "http://www.yahoo.co.jp/";
Sleeping(1000);
]);;


実行結果

SyncHttp [Google]
SyncHttp [Google ニュース]
SyncHttp [Yahoo! JAPAN]
AsyncHttp [Google]
AsyncHttp [Yahoo! JAPAN]
AsyncHttp [Google ニュース]
AsyncHttp [Google]
timeount 1000 ms
timeount 2000 ms

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示