主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

IronPython: シンプルなHTTPサーバを立ててみる

                
 HTTPリクエストに対してHTMLを返すシンプルなサーバを立ててみる。参考は以下。
http://www.voidspace.org.uk/ironpython/simple_http_server.shtml

.NETにあるHttpListenerクラスを使う。
使い方はHttpListenerのインスタンスを作り、
URIプレフィックスを追加し、
Startメソッドを実行し、
BeginGetContextメソッドで要求や応答にアクセスしていじる、
という手順が主なところ。このスクリプトではアクセス数をクライアントに返すために、実行を同期的にしてある。スクリプトはページ下部。

スクリプトは管理者権限で実行する必要がある。管理者権限でコマンドプロンプトを立ち上げたうえで、
ipy.exe SimpleServer.py
というふうにコマンドを打てばサーバスクリプトが実行される。ブラウザで"http://localhost:8080/"にアクセス。

120408.jpg


from System import AsyncCallback

from System.Net import HttpListener, HttpListenerException
from System.Text import Encoding

class SimpleServer(object):
def __init__(self):
self.text = """
<HTML>
<HEAD><TITLE>Welcome to the Simple Server</TITLE></HEAD>
<BODY><STRONG><H1>Welcome to the IronPython Server</H1>%s</STRONG></BODY>
</HTML>
"""
self.pagesServed = 0


def serveforever(self, port):
self.failed = False
listener = HttpListener()
prefix = 'http://*:%s/' % str(port)
listener.Prefixes.Add(prefix)
try:
listener.Start()
except HttpListenerException:
self.failed = True
return

while True:
result = listener.BeginGetContext(AsyncCallback(self.handleRequest), listener)
result.AsyncWaitHandle.WaitOne()

def handleRequest(self, result):
listener = result.AsyncState
try:
context = listener.EndGetContext(result)
except:
# Catch the exception when the thread has been aborted
return
request = context.Request
response = context.Response
text = self.getText(request)
buffer = Encoding.UTF8.GetBytes(text)
response.ContentLength64 = buffer.Length
output = response.OutputStream
output.Write(buffer, 0, buffer.Length)
output.Close()

def getText(self, request):
self.pagesServed += 1
url = '<P><STRONG>URL Requested: %s</STRONG></P>' % request.RawUrl
pagesServed = '<P><STRONG>Number of Pages Served: %s</STRONG></P>' % self.pagesServed
return self.text % (url + pagesServed)

server = SimpleServer()
server.serveforever("8080")


            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。