ソケットとその方法

ソケットは、双方向通信チャネルのエンドポイントです。それらは、プロセス内、同じマシン上のプロセス間、または異なるマシン上のプロセス間で通信する場合があります。同様に、ネットワークソケットは、インターネットなどのコンピュータネットワーク上で実行されている2つのプログラム間の通信フローの1つのエンドポイントです。これは純粋に仮想的なものであり、ハードウェアを意味するものではありません。ネットワークソケットは、IPアドレスとポート番号の一意の組み合わせで識別できます。ネットワークソケットは、TCP、UDPなどのさまざまなチャネルタイプで実装できます。

ネットワークプログラミングで使用されるソケットに関連するさまざまな用語は次のとおりです。

ドメイン

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

タイプ

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

プロトコル

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

ホスト名

これは、ネットワークインターフェイスの識別子として機能します。ホスト名は、文字列、ドット付きクワッドアドレス、またはコロン(場合によってはドット)表記のIPV6アドレスにすることができます。

各サーバーは、1つ以上のポートで呼び出すクライアントをリッスンします。ポートは、Fixnumポート番号、ポート番号を含む文字列、またはサービスの名前です。

ソケットプログラミング用のPythonのソケットモジュール

Pythonでソケットプログラミングを実装するには、Socketモジュールを使用する必要があります。以下は、ソケットを作成するための簡単な構文です。

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

ここでは、ソケットライブラリをインポートしてから、単純なソケットを作成する必要があります。以下は、ソケットの作成中に使用されるさまざまなパラメータです。

  • socket_family −これは、前に説明したように、AF_UNIXまたはAF_INETのいずれかです。

  • socket_type −これはSOCK_STREAMまたはSOCK_DGRAMのいずれかです。

  • protocol −これは通常省略され、デフォルトは0です。

ソケットメソッド

このセクションでは、さまざまなソケットメソッドについて学習します。ソケットメソッドの3つの異なるセットを以下に説明します-

  • サーバーソケットメソッド
  • クライアントソケットメソッド
  • 一般的なソケットメソッド

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

クライアント/サーバーアーキテクチャでは、サービスを提供する1つの集中型サーバーがあり、多くのクライアントがその集中型サーバーからサービスを受け取ります。クライアントはサーバーへの要求も行います。このアーキテクチャのいくつかの重要なサーバーソケットメソッドは次のとおりです。

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

  • socket.listen()−このメソッドは、基本的にソケットへの接続をリッスンします。TCPリスナーを起動します。バックログは、キューに入れられた接続の最大数を指定するこのメソッドの引数です。その最小値は0で、最大値は5です。

  • socket.accept()−これはTCPクライアント接続を受け入れます。ペア(conn、address)は、このメソッドの戻り値のペアです。ここで、connは接続でデータを送受信するために使用される新しいソケットオブジェクトであり、addressはソケットにバインドされたアドレスです。このメソッドを使用する前に、socket.bind()およびsocket.listen()メソッドを使用する必要があります。

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

クライアント/サーバーアーキテクチャのクライアントはサーバーを要求し、サーバーからサービスを受け取ります。このため、クライアント専用の方法は1つだけです。

  • socket.connect(address)−このメソッドは、サーバー接続をアクティブに緊密にします。つまり、このメソッドは、クライアントをサーバーに接続します。引数addressは、サーバーのアドレスを表します。

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

クライアントとサーバーのソケットメソッドの他に、ソケットプログラミングで非常に役立ついくつかの一般的なソケットメソッドがあります。一般的なソケット方式は次のとおりです。

  • socket.recv(bufsize)−名前が示すように、このメソッドはソケットからTCPメッセージを受信します。引数bufsizeはバッファサイズを表し、このメソッドが一度に受信できる最大データを定義します。

  • socket.send(bytes)−このメソッドは、リモートマシンに接続されているソケットにデータを送信するために使用されます。引数bytesは、ソケットに送信されるバイト数を示します。

  • socket.recvfrom(data, address)−このメソッドはソケットからデータを受信します。このメソッドでは、2つのペア(データ、アドレス)の値が返されます。データは受信データを定義し、アドレスはデータを送信するソケットのアドレスを指定します。

  • socket.sendto(data, address)−名前が示すように、このメソッドはソケットからデータを送信するために使用されます。このメソッドでは、2つのペア(データ、アドレス)の値が返されます。データは送信されるバイト数を定義し、アドレスはリモートマシンのアドレスを指定します。

  • socket.close() −このメソッドはソケットを閉じます。

  • socket.gethostname() −このメソッドは、ホストの名前を返します。

  • socket.sendall(data)−このメソッドは、すべてのデータをリモートマシンに接続されているソケットに送信します。エラーが発生するまで不注意にデータを転送し、エラーが発生した場合は、socket.close()メソッドを使用してソケットを閉じます。

サーバーとクライアント間の接続を確立するためのプログラム

サーバーとクライアント間の接続を確立するには、サーバー用とクライアント用の2つの異なるPythonプログラムを作成する必要があります。

サーバーサイドプログラム

このサーバー側ソケットプログラムでは、 socket.bind()特定のIPアドレスとポートにバインドして、そのIPとポートで着信要求をリッスンできるようにするメソッド。後で、socket.listen()サーバーをリッスンモードにするメソッド。の引数としての数、たとえば4socket.listen()メソッドは、サーバーがビジーの場合に4つの接続が待機し続け、5番目のソケットが接続を試みた場合に接続が拒否されることを意味します。を使用してクライアントにメッセージを送信しますsocket.send()方法。終わりに向かって、私たちはsocket.accept() そして socket.close()それぞれ接続を開始および閉じるためのメソッド。以下はサーバーサイドプログラムです-

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

クライアントサイドプログラム

クライアント側のソケットプログラムでは、ソケットオブジェクトを作成する必要があります。次に、サーバーが実行されているポート(この例では12345)に接続します。その後、を使用して接続を確立しますsocket.connect()方法。次に、socket.recv()メソッドでは、クライアントはサーバーからメッセージを受信します。ついに、socket.close() メソッドはクライアントを閉じます。

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

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

これで、サーバー側プログラムを実行した後、ターミナルで次の出力が得られます-

socket is listening
Got connection from ('192.168.43.75', 49904)

そして、クライアント側のプログラムを実行した後、他の端末で次の出力を取得します-

Connection Established

ネットワークソケット例外の処理

つまり、2つのブロックがあります try そして exceptこれは、ネットワークソケットの例外を処理するために使用できます。以下は、例外を処理するためのPythonスクリプトです-

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

出力

上記のプログラムは次の出力を生成します-

No connection between client and server

上記のスクリプトでは、最初にソケットオブジェクトを作成しました。これに続いて、サーバーが実行されているホストIPアドレスとポート番号(この例では12345)を指定します。後で、tryブロックが使用され、その内部でsocket.bind()メソッドでは、IPアドレスとポートをバインドしようとします。使用していますsocket.settimeout()クライアントの待機時間を設定する方法。この例では、3秒を設定しています。サーバーとクライアント間で接続が確立されない場合にメッセージを出力するexceptブロックが使用されます。