ホームページ >バックエンド開発 >Python チュートリアル >Python サーバー開発 -- ネットワークの基礎
ネットワークは下から上に物理層、データリンク層、ネットワーク層、トランスポート層、セッション層、プレゼンテーション層、アプリケーション層に分かれています。
HTTP は高レベルのプロトコルであるのに対し、TCP/IP は多くのサブプロトコルを含むプロトコル セットです。これには、FTP、UDP、トランスポート層の TCP プロトコル、ネットワーク層の IP プロトコルなど、HTTP、Telnet プロトコルなどの高レベルのプロトコルが含まれます。HTTP は、TCP/IP のサブプロトコルです。
ソケットは、(プログラマレベルでの) TCP/IP プロトコルのカプセル化とアプリケーションです。 TPC/IP プロトコルは、主にネットワーク内でデータが送信される方法を解決するトランスポート層プロトコルであるのに対し、HTTP は主にデータをパッケージ化する方法を解決するアプリケーション層プロトコルであるとも言えます。
データを送信する場合、(トランスポート層) TCP/IP プロトコルのみを使用できますが、その場合、送信されたデータを意味のあるものにしたい場合は、アプリケーション層がなければデータの内容を識別することができません。アプリケーションを使用する HTTP、FTP、TELNET など、多くのアプリケーション層プロトコルがあります。独自のアプリケーション層プロトコルを定義することもできます。 WEB は、アプリケーション層プロトコルとして HTTP プロトコルを使用して HTTP テキスト情報をカプセル化し、トランスポート層プロトコルとして TCP/IP を使用してそれをネットワークに送信します。
私たちがよく話すソケットとは何ですか? 実際、ソケットは TCP/IP プロトコルのカプセル化です。ソケット自体はプロトコルではなく、ソケットを通じて TCP/IP を使用できます。プロトコル。実際、Socket は必ずしも TCP/IP プロトコルに関連しているわけではありません。 Socket プログラミング インターフェイスが設計されたとき、他のネットワーク プロトコルにも適応できることが期待されました。したがって、ソケットの出現により、プログラマは TCP/IP プロトコル スタックを簡単に使用できるようになります。これは、TCP/IP プロトコルの抽象化であり、作成、リッスン、接続、受け入れ、送信、読み取り、書き込みなど。
TCP/IP は単なるプロトコル スタックであり、オペレーティング システムの動作メカニズムと同様に、具体的に実装する必要があり、外部操作インターフェイスも提供する必要があります。オペレーティング システムが win32 プログラミング インターフェイスなどの標準プログラミング インターフェイスを提供するのと同じように、TCP/IP もプログラマーがネットワーク開発に使用できるインターフェイスを提供します。これがソケット プログラミング インターフェイスです。
もっと鮮明な説明があります: HTTP はデータのカプセル化または表示の特定の形式を提供する自動車であり、ソケットはネットワーク通信機能を提供するエンジンです。
実際、トランスポート層の TCP はネットワーク層の IP プロトコルに基づいており、アプリケーション層の HTTP プロトコルはトランスポート層の TCP プロトコルに基づいています。前述したように、ソケット自体はプロトコルではありません。上記では、TCP または UDP プログラミング用のインターフェイスのみを提供します。
ソケットを使用してネットワーク接続を確立する手順:
ソケット接続を確立するには、少なくとも 1 組のソケットが必要です。そのうちの 1 つはクライアント上で実行される ClientSocket と呼ばれ、もう 1 つはサーバー上で実行される ServerSocket と呼ばれます。
ソケット間の接続プロセスは、サーバー監視、クライアント要求、接続確認の 3 つのステップに分かれています。
1.サーバー監視: サーバー側ソケットは特定のクライアント ソケットを見つけませんが、接続を待機している状態にあり、ネットワークの状態をリアルタイムで監視し、クライアントの接続要求を待ちます。
2.クライアントリクエスト: 接続リクエストを行うクライアントのソケットを指し、接続対象はサーバーのソケットです。これを行うには、クライアントのソケットは、まず接続先のサーバーのソケットを記述し、サーバー側のソケットのアドレスとポート番号を指定して、サーバー側のソケットに接続要求を行う必要があります。
3.接続確認: サーバー側ソケットは、クライアント ソケットからの接続要求をリッスンまたは受信すると、クライアント ソケットの要求に応答し、新しいスレッドを確立し、サーバー側ソケットの説明をクライアントに送信します。クライアントがこの説明を確認すると、両者の間で接続が正式に確立されます。サーバー側ソケットは引き続き待機状態にあり、他のクライアント ソケットからの接続要求を受信し続けます。
HTTP リンクの特徴
HTTP プロトコルは、Web ネットワーキングの基礎であり、携帯電話ネットワーキングで一般的に使用されるプロトコルの 1 つであるハイパーテキスト転送プロトコルです。HTTP プロトコルは、TCP プロトコルに基づいて構築されたアプリケーションです。
HTTP 接続の最も注目すべき機能は、クライアントによって送信された各リクエストが、リクエストの完了後にサーバーに応答を返すことを要求することです。コネクションを確立してからコネクションを閉じるまでのことを「コネクション」と呼びます。
インターネット プロトコル
IP は 32 ビットの符号なし整数です。 IP アドレスは、DNS (ドメイン ネーム システム) データベースを通じてドメイン名にマッピングされます
#!/usr/bin/env python # Foundations of Python Network Programming - Chapter 1 - getname.py import socket hostname = 'google.com' addr = socket.gethostbyname(hostname) print 'The address of', hostname, 'is', addr # The address of google.com is 173.194.72.113
Python ネットワーク プログラミング:
Python は、基盤となるオペレーティング システムのソケット インターフェイスにアクセスするためのすべてのメソッドを提供し、暗号化されたソケット インターフェイスのセットも提供します。認証された通信サービス、SSL/TLS 。
ソケットは実際にはファイル記述子であり、ローカルファイルとは異なり、ネットワーク上のファイルに接続します。
1. UDP ローカル接続を作成します:
#!/usr/bin/env python import socket, sys s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) MAX = 65535 PORT = 1060 if sys.argv[1:] == ['server']: s.bind(('127.0.0.1', PORT)) print 'Listening at', s.getsockname() while True: data, address = s.recvfrom(MAX) print 'The client at', address, 'says', repr(data) s.sendto('Your data was %d bytes' % len(data), address) elif sys.argv[1:] == ['client']: print 'Address before sending:', s.getsockname() s.sendto('This is my message', ('127.0.0.1', PORT)) print 'Address after sending', s.getsockname() data, address = s.recvfrom(MAX) # overly promiscuous - see text! print 'The server', address, 'says', repr(data) else: print >>sys.stderr, 'usage: udp_local.py server|client'
次のコードを実行します:
python filename.py server #Listening at ('127.0.0.1', 1060) #Address before sending: ('0.0.0.0', 0) #Address after sending ('0.0.0.0', 62892) #The server ('127.0.0.1', 1060) says 'Your data was 18 bytes' python filename.py client #The client at ('127.0.0.1', 62892) says 'This is my message'
2. リモート接続を作成し、受信した情報を確認します:
import random, socket, sys s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) MAX = 65535 PORT = 1060 if 2 <= len(sys.argv) <= 3 and sys.argv[1] == 'server': interface = sys.argv[2] if len(sys.argv) > 2 else '' s.bind((interface, PORT)) print 'Listening at', s.getsockname() while True: data, address = s.recvfrom(MAX) if random.randint(0, 1): print 'The client at', address, 'says:', repr(data) s.sendto('Your data was %d bytes' % len(data), address) else: print 'Pretending to drop packet from', address elif len(sys.argv) == 3 and sys.argv[1] == 'client': hostname = sys.argv[2] s.connect((hostname, PORT)) print 'Client socket name is', s.getsockname() delay = 0.1 while True: s.send('This is another message') print 'Waiting up to', delay, 'seconds for a reply' s.settimeout(delay) try: data = s.recv(MAX) except socket.timeout: delay *= 2 # wait even longer for the next request if delay > 2.0: raise RuntimeError('I think the server is down') else: break # we are done, and can stop looping print 'The server says', repr(data) else: print >>sys.stderr, 'usage: udp_remote.py server [ <interface> ]' print >>sys.stderr, ' or: udp_remote.py client <host>' sys.exit(2)
这里的s.connect((hostname, PORT))方法,可以让我们不用每次都调用s.sendto('This is my message', ('127.0.0.1', PORT))。直接调用
s.send('This is another message')。