勉強のために、libuvのサンプルをいろいろ集めてます。
今日は mattnさんの書かれていたHTTP clientをpyuvで書いてみました。
ソース
import sys import socket import pyuv def on_close(tcp_handle): print("[closed]") def on_read(tcp_handle, data): print("[read]") if data is None: tcp_handle.close(on_close) return data = data.strip() if not data: return print(data) def on_write(tcp_handle, status): print("[written]") tcp_handle.start_read(on_read) def on_connection(tcp_handle, status): print("[connected]") data = "GET / HTTP/1.0\r\n\r\n" tcp_handle.write(data, on_write) def main(host): print("[main]") loop = pyuv.Loop() client = pyuv.TCP(loop) ip = socket.gethostbyname(host) client.connect((ip, 80),on_connection) loop.run() if __name__ == "__main__": print("PyUV version %s" % pyuv.__version__) main(sys.argv[1]) print("Stopped!")
実行例
localhostに接続
$ python http_client.py localhost
PyUV version 0.2.0 [main] [connected] [written] [read] HTTP/1.1 200 OK Server: nginx/1.0.11 Date: Mon, 26 Dec 2011 16:39:55 GMT Content-Type: text/html Content-Length: 151 Last-Modified: Mon, 04 Oct 2004 15:04:06 GMT Connection: close Accept-Ranges: bytesWelcome to nginx! < center>< h1>Welcome to nginx!< /h1>< /center> [read] [closed] Stopped!
所感
コールバック関数をたくさん書かないと行けないのが結構めんどくさい気がする。
ここらへんもTornadoっぽいなー