Python-network-programming-python-sockets-programming

提供:Dev Guides
移動先:案内検索

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

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

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

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

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

Sr.No. Term & Description
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_モジュールで利用可能な_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です。

_socket_オブジェクトを取得したら、必要な関数を使用してクライアントまたはサーバープログラムを作成できます。

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

Sr.No. Method & Description
1

s.bind()

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

2

s.listen()

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

3

s.accept()

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

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

Sr.No. Method & Description
1

s.connect()

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

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

Sr.No. Method & Description
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)*関数を呼び出して、指定されたホスト上のサービスの_port_を指定します。

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

#!/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_モジュール関数を使用してソケットクライアントを作成するのは非常に簡単です。

  • socket.connect(hosname、port)*は、_port_上の_hostname_への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('finddevguides.com', 'www')

pprint(addrinfo)

# get server hostname
print socket.gethostname()

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

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