ネットワークプログラミング(一)基礎知識

4214 ワード

1.1 Tcpデータ送信
マシンAからマシンBに送ると、
データ送信は多くのパケットに分解され、マシンBになると、マシンBが再合成されます.送信中、受信者にパケットを受信していないことを要求し、フィードバック情報が必要であり、フィードバックがなければ、tcpは自動的に再送信され、あるパケットの欠落を防止し、データ全体の破損を招くことを試みた.各パケットにはシーケンス番号があり、B側がすべてのパケットを受信した後、データを再編成できることを保証します.
1.2 IPアドレスとポート
Bにデータを送信するには、まずBコンピュータのアドレスを知っておく必要があります.次に、Bコンピュータには多くのプログラムがある可能性があります.例えば、qq、メール、ブラウザなど、具体的にはどのプログラムに送信しますか.だからポートという概念があって、1つのプログラムは1つのポートに対応して、ポートの値の範囲は一般的に:1024~65535
1.3イントラネットと外部ネット
ある时、私たちは学校、会社で、会社のパソコンでサーバーを建てて、それから外網のクライアントで使用することができます;では、このときサーバーのipアドレス、ポートをどのように設定するか:あるポートをBにマッピングし、Aでルータに接続するこのポートをルータに設定する必要があります.
1.4 DNS
DNSは分散型データベースで、超巨大です.各レコードには、(ドメイン名、ipアドレス);
1.5ブラウザ
ブラウザの主な機能は、アクセスしたいネットワークリソースをブラウザウィンドウに表示するようにサーバに要求することです.ここでは一般的にHTMLドキュメント、画像など他のタイプを指します.リソースの場所は、ユーザーがURL(統合リソース識別子)を使用して指定します.
ブラウザのコアであるレンダリングエンジンは、リクエストの内容を表示します.要求されたコンテンツがHTMLであれば、HTMLとCSSのコンテンツを解析し、解析したコンテンツを画面に表示します.
ワークフロー:
1.URLアドレスを入力するかURLのリンクをクリックする
2.ブラウザはURLアドレスに基づいてDNSを結合し、URLに対応するIPアドレスを解析する
1)ブラウザはTCPのパケットを送信することによって、サーバーに接続を開くように要求する
2)サーバもパケットを送信することでクライアントのブラウザに応答し,ブラウザにデータをサーバに送信できることを伝える.
3)HTTP要求の送信
4.サーバが要求を受けた後、対応する応答内容を返す
5.ブラウザはサーバ側から返された応答内容を解析し、ページを表示する
URLを入力すると、ブラウザはこのURLに対応するIPが何であるかを知り、IPアドレスを知ってこそ、ブラウザが指定したサーバの具体的なIPとポート番号に要求を送信する準備ができます.その後、サーバ側は応答結果をクライアントに送信します.この応答結果はhtmlのドキュメントであり、画像、スクリプト、CSSなどを含まない、つまりページのhtml構造である.
1.6 Webサービス
1.6.1クライアント
pythonのRequestsモジュールを直接使用できます.
r = requests.get('https://github.com/timeline.json')

r = requests.post("http://httpbin.org/post")
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)

1.7 http形式
1.7.1要求フォーマット
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*

最初のローは、リクエストメソッドとバージョンです.
次は、ヘッダ、データ(フォームの内容)が要求されます.
1.7.2応答フォーマット
サーバの応答は次のとおりです.
HTTP/1.0 200 OK 
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84


  Hello World

応答のフォーマットは「ヘッダ情報+空行(r)+データ」です.ここで、第1行は「プロトコルバージョン+ステータスコード+ステータス記述」である.
1.8画像ファイルのアップロード
クライアント:
#coding=utf-8  
import requests  
url = 'http://localhost:8080'  
path = u'D:      .jpg'  
print path  
files = {'file': open(path, 'rb')}  
r = requests.post(url, files=files)  
print r.url,r.text  

サービス:
#coding=utf-8  
from BaseHTTPServer import BaseHTTPRequestHandler  
import cgi  
class   PostHandler(BaseHTTPRequestHandler):  
    def do_POST(self):  
        form = cgi.FieldStorage(  
            fp=self.rfile,  
            headers=self.headers,  
            environ={'REQUEST_METHOD':'POST',  
                     'CONTENT_TYPE':self.headers['Content-Type'],  
                     }  
        )  
        self.send_response(200)  
        self.end_headers()  
        self.wfile.write('Client: %sn ' % str(self.client_address) )  
        self.wfile.write('User-agent: %sn' % str(self.headers['user-agent']))  
        self.wfile.write('Path: %sn'%self.path)  
        self.wfile.write('Form data:n')  
        for field in form.keys():  
            field_item = form[field]  
            filename = field_item.filename  
            filevalue  = field_item.value  
            filesize = len(filevalue)#    (  )  
            print len(filevalue)  
            with open(filename.decode('utf-8')+'a','wb') as f:  
                f.write(filevalue)  
        return  
if __name__=='__main__':  
    from BaseHTTPServer import HTTPServer  
    sever = HTTPServer(('localhost',8080),PostHandler)  
    print 'Starting server, use  to stop'  
    sever.serve_forever()  

参考文献:
1、http://blog.csdn.net/testcs_dn/article/details/50449106
2、http://www.ruanyifeng.com/blog/2016/08/http.html