ホームページ >バックエンド開発 >Python チュートリアル >Python ソケット プログラミングの概要
Python でサーバーを記述する手順:
1. 最初のステップは、ソケット オブジェクトを作成することです。ソケット コンストラクターを呼び出します。例:
socket =ソケット.socket( family, type )
family パラメーターは、AF_INET または AF_UNIX のアドレス ファミリを表します。 AF_INET ファミリにはインターネット アドレスが含まれており、AF_UNIX ファミリは同じマシン上のプロセス間通信に使用されます。
type パラメータは、SOCK_STREAM (ストリーム ソケット) および SOCK_DGRAM (データグラム ソケット) のいずれかであるソケット タイプを表します。
2. 2 番目のステップは、ソケットを指定されたアドレスにバインドすることです。これは、ソケット オブジェクトのバインド メソッドを通じて実現されます:
socket.bind(address)
AF_INET によって作成されたソケットの場合、アドレス address は (host, port) の形式の 2 要素のタプルである必要があります。 host はホストを表し、port はポート番号を表します。ポート番号が使用されている場合、ホスト名が間違っている場合、またはポートが予約されている場合、bind メソッドはソケット.エラー例外を発生させます。
3. 3 番目のステップは、socket ソケットの listen メソッドを使用して接続要求を受信することです。
socket.listen( backlog )
backlog は、サーバーへの接続を許可するクライアントの最大数を指定します。その値は少なくとも 1 です。接続要求を受信した後、これらの要求をキューに入れる必要があります。キューがいっぱいの場合、要求は拒否されます。
4. 4 番目のステップでは、サーバーソケットはクライアントがソケットの accept メソッドを通じて接続を要求するのを待ちます。
connection, address =ソケット.accept()
acceptメソッドが呼び出されると、ソケットは「待機」状態になります。クライアントが接続を要求すると、メソッドは接続を確立してサーバーに戻ります。 accept メソッドは、2 つの要素 (接続、アドレス) を含むタプルを返します。最初の要素である connection は、サーバーがクライアントと通信するために使用する新しいソケット オブジェクトです。2 番目の要素である address は、クライアントのインターネット アドレスです。
5. 5 番目のステップは、サーバーとクライアントが send メソッドと recv メソッドを介して通信 (データを送信) する段階です。サーバーは send を呼び出し、情報を文字列の形式でクライアントに送信します。 send メソッドは、送信された文字数を返します。サーバーは、recv メソッドを使用してクライアントから情報を受信します。 recv を呼び出すとき、サーバーは、このメソッド呼び出しで受信できるデータの最大量に対応する整数を指定する必要があります。 recv メソッドは、データを受信すると「ブロック」状態に入り、最終的に受信データを表す文字列を返します。送信されるデータの量が、recv で許可される量を超える場合、データは切り捨てられます。過剰なデータは受信側でバッファリングされます。後続の recv 呼び出しでは、余分なデータが (recv への最後の呼び出し以降にクライアントが送信した可能性のある他のデータとともに) バッファーから削除されます。
6. 送信が完了すると、サーバーはソケットの close メソッドを呼び出して接続を閉じます。
Python でクライアントを記述する手順:
1. サーバーに接続するためのソケットを作成します:socket =ソケット.socket(family, type)
2. ソケットの connect メソッドを使用してサーバーに接続します。 AF_INET ファミリの場合、接続形式は次のとおりです。
socket.connect( (host, port) )
host はサーバーのホスト名または IP を表し、port はサーバー プロセスにバインドされているポート番号を表します。接続が成功すると、クライアントはソケットを介してサーバーと通信できます。接続が失敗すると、socket.error 例外が発生します。
3. 処理段階では、クライアントとサーバーはsendメソッドとrecvメソッドを通じて通信します。
4. 送信が完了すると、クライアントはソケットの close メソッドを呼び出して接続を閉じます。
これは簡単な例です:
server.py
if __name__ == '__main__': import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost', 8001)) sock.listen(5) while True: connection,address = sock.accept() try: connection.settimeout(5) buf = connection.recv(1024) if buf == '1': connection.send('welcome to server!') else: connection.send('please go out!') except socket.timeout: print 'time out' connection.close()
client.py
if __name__ == '__main__': import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost', 8001)) import time time.sleep(2) sock.send('1') print sock.recv(1024) sock.close()
ターミナルでserver.pyを実行し、次にclient.pyを実行すると、ターミナルに「welcome to server!」と表示されます。 client.py の sock.send('1') を別の値に変更すると、time.sleep(2) を 5 より大きい値に変更すると、端末に「外出してください」と表示されます。タイムアウトになります。