Python-ソケットプログラミング

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

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

ソケットは、双方向通信チャネルのエンドポイントです。ソケットは、プロセス内、同じマシン上のプロセス間、または異なる大陸のプロセス間で通信できます。Pythonのソケットモジュールを使用して、ソケットを作成して使用します。

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

シニア番号 用語と説明
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/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, port )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

パブリックURLのソケット

以下の例では、ソケットモジュールのいくつかのメソッドを使用して、サーバーのアドレス情報とホスト名の詳細を検索します。

import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()

上記のプログラムを実行すると、次の出力が得られます-

[(2, 1, 0, '', ('94.130.81.180', 80))]
DESKTOP-JXYKQCPLP