2014年8月5日火曜日

開発環境

Head First C ―頭とからだで覚えるCの基本(David Griffiths (著)、Dawn Griffiths (著) 中田 秀基(監訳)(翻訳)、木下 哲也 (翻訳)、オライリージャパン)の11章(ソケットとネットワーキング(127.0.0.1という場所はない)、コードマグネット(p.494)をpythonで考えてみる。

コードマグネット(p.494)

コード(BBEdit, Emacs)

sample494.py

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import os
import sys
import socket

def error(msg):
    print("{0}: {1}".format(msg, err))
    sys.exit(1)
    
def say(s):
    try:
        data = s.encode('utf-8')
        count = connect_d.send(data)
        if count != len(data):
            raise Exception()
    except Exception as err:
        raise Exception('クライアントの通信エラー: {0}'.format(err))

host = 'en.wikipedia.org'
port = 80

d_sock = socket.socket()

try:
    d_sock.connect((host, port))
except Exception as err:
    error(err)

try:
    d_sock.send('GET /wiki/{0} http/1.1\r\n'.format(
        sys.argv[1]).encode('utf-8'))
except Exception as err:
    error(err)

try:
    d_sock.send(b'Host: en.wikipedia.org\r\n\r\n')
except Exception as err:
    error(err)

while True:
    try:
        data = d_sock.recv(255)
    except Exception as err:
        error(err)
    print(data.decode('utf-8'), end='')
    if data == b'':
        break

d_sock.close()

入出力結果(Terminal, IPython)

$ ./sample494.py "O'Reilly_Media"
HTTP/1.1 200 OK
Server: Apache
...省略
 </body>
</html>    $
$

urllib.rueqst moduleをインポートで手軽にした版。

コード(BBEdit, Emacs)

sample494_1.py

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import sys
import urllib.request

host = 'en.wikipedia.org'
data = urllib.request.urlopen('http://{0}/wiki/{1}'.format(host, sys.argv[1]))

for line in data:
    line = line.decode('utf-8')
    print(line, end='')

data.close()

入出力結果(Terminal, IPython)

$ ./sample494_1.py "O'Reilly_Media"
<!DOCTYPE html>
<html lang="en" dir="ltr" class="client-nojs">

... 省略
 </body>
</html>
 $

0 コメント:

コメントを投稿