Contents
Pythonネットワークプログラミング
Pythonは、ネットワークサービスへの2つのレベルのアクセスを提供します。低レベルでは、基盤となるオペレーティングシステムの基本ソケットサポートにアクセスできます。これにより、コネクション型プロトコルとコネクションレス型プロトコルの両方のクライアントとサーバーを実装できます。
Pythonには、特定のアプリケーションレベルのネットワークプロトコル(FTP、HTTPなど)へのより高いレベルのアクセスを提供するライブラリもあります。
この章では、ネットワークソケットプログラミングの最も有名な概念について解説します。
ソケットとは何か?
ソケットは、双方向通信チャネルのエンドポイントです。ソケットは、プロセス内、同じマシン上のプロセス間、または異なる大陸のプロセス間で通信することができます。
ソケットは、Unixドメインソケット、TCP、UDPなど、いくつかの異なるチャネルタイプで実装できます。ソケットライブラリは、共通のトランスポートだけでなく、残りの部分を処理するための汎用インタフェースを処理するための特定のクラスを提供します。
ソケットには独自のボキャブラリがあります。
期間 | 説明 |
---|---|
ドメイン | トランスポートメカニズムとして使用されるプロトコルファミリ。これらの値は、AF_INET、PF_INET、PF_UNIX、PF_X25などの定数です。 |
タイプ | 2つのエンドポイント間の通信タイプ。通常、接続指向プロトコルの場合はSOCK_STREAM、コネクションレスプロトコルの場合はSOCK_DGRAMです。 |
プロトコル | 典型的にはゼロであり、これはドメインおよびタイプ内のプロトコルの変形を識別するために使用することができる。 |
ホスト名 | ネットワークインタフェースの識別子:
|
ポート | 各サーバーは、1つまたは複数のポートを呼び出しているクライアントをリッスンします。ポート番号は、Fixnumのポート番号、ポート番号を含む文字列、またはサービスの名前です。 |
ソケットモジュール
ソケットを作成するには、ソケットモジュールで使用可能なsocket.socket()関数を使用する必要があります。この関数は、一般的な構文 –
s = socket.socket (socket_family, socket_type, protocol=0)
ここでは、パラメータの説明です –
- socket_family:前に説明したように、AF_UNIXまたはAF_INETのいずれかです。
- socket_type: SOCK_STREAMまたはSOCK_DGRAMです。
- protocol:これは通常省略され、デフォルトで0になります。
ソケットオブジェクトを取得したら、必要な関数を使用してクライアントまたはサーバープログラムを作成できます。以下は必要な機能の一覧です –
サーバーソケットメソッド
方法 | 説明 |
---|---|
s.bind() | このメソッドは、アドレス(ホスト名、ポート番号のペア)をソケットにバインドします。 |
s.listen() | このメソッドは、TCPリスナーを設定して開始します。 |
s.accept() | これは、受動的にTCPクライアント接続を受け入れ、接続が到着する(ブロックする)まで待機します。 |
クライアントソケットメソッド
方法 | 説明 |
---|---|
s.connect() | この方法は、TCPサーバー接続をアクティブに開始します。 |
一般的なソケットメソッド
方法 | 説明 |
---|---|
s.recv() | このメソッドは、TCPメッセージ |
s.send() | このメソッドは、TCPメッセージ |
s.recvfrom() | このメソッドは、UDPメッセージ |
s.sendto() | このメソッドは、UDPメッセージ |
s.close() | このメソッドはソケットを閉じます。 |
socket.gethostname() | ホスト名を返します。 |
シンプルなサーバー
インターネットサーバーを作成するために、socketモジュールで使用できるsocket関数を使用してソケットオブジェクトを作成します。ソケットオブジェクトは、ソケットサーバーをセットアップするために他の関数を呼び出すために使用されます。
bind(hostname、port)関数を呼び出して、指定されたホスト上のサービスのポートを指定します。
次に、返されたオブジェクトのacceptメソッドを呼び出します。このメソッドは、クライアントが指定したポートに接続するまで待機し、そのクライアントへの接続を表す接続オブジェクトを返します。
#!/usr/bin/python # This is server.py file import socket # Import socket module s = socket.socket() # Create a socket object host = socket.gethostname() # Get local machine name port = 12345 # Reserve a port for your service. s.bind((host, port)) # Bind to the port s.listen(5) # Now wait for client connection. while True: c, addr = s.accept() # Establish connection with client. print 'Got connection from', addr c.send('Thank you for connecting') c.close() # Close the connection
シンプルなクライアント
与えられたポート12345と与えられたホストへの接続を開く非常に簡単なクライアントプログラムを書くことにしましょう。これは、Pythonのソケットモジュール関数を使用してソケットクライアントを作成するのは非常に簡単です。
socket.connect(hosname、ポート)へのTCP接続が開き、ホスト名にポートを。ソケットを開いたら、IOオブジェクトのようにそのソケットから読み取ることができます。完了したら、ファイルを閉じるときと同じように閉じてください。
次のコードは、特定のホストとポートに接続し、使用可能なデータをソケットから読み取り、終了する非常にシンプルなクライアントです。
#!/usr/bin/python # This is client.py file import socket # Import socket module s = socket.socket() # Create a socket object host = socket.gethostname() # Get local machine name port = 12345 # Reserve a port for your service. s.connect((host, port)) print s.recv(1024) s.close # Close the socket when done
このserver.pyをバックグラウンドで実行し、上記のclient.pyを実行して結果を確認します。
# Following would start a server in background. $ python server.py & # Once server is started run client as follows: $ python client.py
これは、
Got connection from ('127.0.0.1', 48437) Thank you for connecting
Pythonインターネットモジュール
Pythonネットワーク/インターネットプログラミングにおけるいくつかの重要なモジュールのリスト。
プロトコル | 共通の機能 | ポート番号 | Pythonモジュール |
---|---|---|---|
HTTP | ウェブページ | 80 | httplib、urllib、xmlrpclib |
NNTP | Usenetのニュース | 119 | nntplib |
FTP | ファイル転送 | 20 | ftplib、urllib |
SMTP | メールを送信する | 25 | smtplib |
POP3 | メールを取得中 | 110 | ポプリン |
IMAP4 | メールを取得中 | 143 | イマプリブ |
Telnet | コマンドライン | 23 | telnetlib |
Gopher | 伝票転送 | 70 | gopherlib、urllib |