Python3-ネットワークプログラミング

Pythonは、ネットワークサービスへの2つのレベルのアクセスを提供します。低レベルでは、基盤となるオペレーティングシステムの基本的なソケットサポートにアクセスできます。これにより、コネクション型プロトコルとコネクションレス型プロトコルの両方のクライアントとサーバーを実装できます。

Pythonには、FTP、HTTPなどの特定のアプリケーションレベルのネットワークプロトコルへの高レベルのアクセスを提供するライブラリもあります。

この章では、ネットワーキングで最も有名な概念であるソケットプログラミングについて理解します。

ソケットとは何ですか?

ソケットは、双方向通信チャネルのエンドポイントです。ソケットは、プロセス内、同じマシン上のプロセス間、または異なる大陸のプロセス間で通信できます。

ソケットは、Unixドメインソケット、TCP、UDPなどのさまざまなチャネルタイプで実装できます。ソケットライブラリは、共通のトランスポートだけでなく、残りの部分を処理するための汎用インタフェースを処理するための特定のクラスを提供します。

ソケットには独自の語彙があります-

シニア番号 用語と説明
1

domain

トランスポートメカニズムとして使用されるプロトコルのファミリー。これらの値は、AF_INET、PF_INET、PF_UNIX、PF_X25などの定数です。

2

type

2つのエンドポイント間の通信のタイプ。通常、コネクション型プロトコルの場合はSOCK_STREAM、コネクションレス型プロトコルの場合はSOCK_DGRAMです。

3

protocol

通常はゼロです。これは、ドメインおよびタイプ内のプロトコルのバリアントを識別するために使用できます。

4

hostname

ネットワークインターフェースの識別子-

  • 文字列。ホスト名、ドット付きクワッドアドレス、またはコロン(場合によってはドット)表記のIPV6アドレスにすることができます。

  • INADDR_BROADCASTアドレスを指定する文字列「<broadcast>」。

  • INADDR_ANYを指定する長さゼロの文字列、または

  • ホストバイト順のバイナリアドレスとして解釈される整数。

5

port

各サーバーは、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です。

ソケットオブジェクトを取得したら、必要な関数を使用してクライアントまたはサーバープログラムを作成できます。以下は必要な機能のリストです-

サーバーソケットメソッド

シニア番号 方法と説明
1

s.bind()

このメソッドは、アドレス(ホスト名、ポート番号のペア)をソケットにバインドします。

2

s.listen()

このメソッドは、TCPリスナーをセットアップして開始します。

3

s.accept()

これはTCPクライアント接続を受動的に受け入れ、接続が到着するまで待機します(ブロッキング)。

クライアントソケットメソッド

シニア番号 方法と説明
1

s.connect()

このメソッドは、TCPサーバー接続をアクティブに開始します。

一般的なソケットメソッド

シニア番号 方法と説明
1

s.recv()

このメソッドはTCPメッセージを受信します

2

s.send()

このメソッドはTCPメッセージを送信します

3

s.recvfrom()

このメソッドはUDPメッセージを受信します

4

s.sendto()

このメソッドはUDPメッセージを送信します

5

s.close()

このメソッドはソケットを閉じます

6

socket.gethostname()

ホスト名を返します。

シンプルなサーバー

インターネットサーバーを作成するには、 socketソケットオブジェクトを作成するためにソケットモジュールで使用できる関数。次に、ソケットオブジェクトを使用して、他の関数を呼び出してソケットサーバーをセットアップします。

今、 bind(hostname, port)指定されたホスト上のサービスのポートを指定する関数。

次に、返されたオブジェクトのacceptメソッドを呼び出します。このメソッドは、クライアントが指定したポートに接続するまで待機してから、そのクライアントへの接続を表す接続オブジェクトを返します。

#!/usr/bin/python3           # This is server.py file
import socket                                         

# create a socket object
serversocket = socket.socket(
	        socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999                                           

# bind to the port
serversocket.bind((host, port))                                  

# queue up to 5 requests
serversocket.listen(5)                                           

while True:
   # establish a connection
   clientsocket,addr = serversocket.accept()      

   print("Got a connection from %s" % str(addr))
    
   msg = 'Thank you for connecting'+ "\r\n"
   clientsocket.send(msg.encode('ascii'))
   clientsocket.close()

シンプルなクライアント

特定のポート12345と特定のホストへの接続を開く非常に単純なクライアントプログラムを作成しましょう。Pythonのソケットモジュール関数を使用してソケットクライアントを作成するのは非常に簡単です。

ザ・ socket.connect(hosname, port )TCP接続が開き、ホスト名ポートを。ソケットを開いたら、他のIOオブジェクトと同じようにソケットから読み取ることができます。完了したら、ファイルを閉じるのと同じように、忘れずに閉じてください。

次のコードは、特定のホストとポートに接続し、ソケットから使用可能なデータを読み取り、終了する非常に単純なクライアントです。

#!/usr/bin/python3           # This is client.py file

import socket

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999

# connection to hostname on the port.
s.connect((host, port))                               

# Receive no more than 1024 bytes
msg = s.recv(1024)                                     

s.close()
print (msg.decode('ascii'))

次に、この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

出力

これにより、次の結果が得られます-

on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
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 poplib
IMAP4 メールを取得する 143 imaplib
Telnet コマンドライン 23 telnetlib
Gopher ドキュメントの転送 70 gopherlib、urllib

FTP、SMTP、POP、およびIMAPプロトコルで動作するには、上記のすべてのライブラリを確認してください。

さらなる読み物

これは、ソケットプログラミングのクイックスタートでした。それは広大な主題です。詳細については、次のリンクを参照することをお勧めします-

  • Unixソケットプログラミング。

  • Pythonソケットライブラリとモジュール。