Pythonのソケットプログラミングとは何ですか?それをマスターする方法は?



ピクルスとソケットを使用してPythonオブジェクトを転送するとともに、クライアントサーバー通信とともにPythonでのソケットプログラミングとは何かを学びます。

インターネットは間違いなく「存在の魂」になり、その活動は「接続」または「ネットワーク」によって特徴付けられます。これらのネットワークは、の最も重要なファンダメンタルズの1つを使用して可能になります。 ソケット。 この記事では、Pythonでのソケットプログラミングを扱うすべての分野を取り上げます。ソケットはこれらの接続を行うのに役立ちますが、 、間違いなく、それを簡単にします。

この記事で取り上げているすべてのトピックを簡単に見てみましょう。





なぜソケットを使用するのですか?
Pythonのソケットとは何ですか?
Pythonでソケットプログラミングを実現する方法
サーバーとは何ですか?
クライアントとは何ですか?
エコークライアントサーバー
マルチコミュニケーション
Pythonオブジェクトの転送



なぜソケットを使用するのですか?

ソケットはネットワーキングのバックボーンです。これらは、2つの異なるプログラムまたはデバイス間での情報の転送を可能にします。たとえば、ブラウザを開くと、クライアントとしてのあなたは情報を転送するためにサーバーへの接続を作成しています。

このコミュニケーションを深く掘り下げる前に、まずこれらのソケットが正確に何であるかを理解しましょう。

ソケットとは何ですか?

一般的に、ソケットはデータを送受信するために構築された内部エンドポイントです。 1つのネットワークには、通信デバイスまたはプログラムごとに1つずつ、合計2つのソケットがあります。これらのソケットは、IPアドレスとポートの組み合わせです。 1つのデバイスには、使用されているポート番号に基づいて「n」個のソケットを含めることができます。さまざまなタイプのプロトコルにさまざまなポートを使用できます。一般的なポート番号と関連するプロトコルの詳細については、次の画像をご覧ください。




共通ポート-SocketProgramminginPython-Edureka

ソケットの概念が明確になったので、PythonのSocketモジュールを見てみましょう。

Javaで追加する方法

Pythonでソケットプログラミングを実現する方法:

Pythonでソケットプログラミングを実現するには、をインポートする必要があります ソケット モジュールまたは 。このモジュールは、ソケットの作成に必要な組み込みメソッドで構成されており、ソケットを相互に関連付けるのに役立ちます。

重要な方法のいくつかは次のとおりです。

メソッド説明

socket.socket()

ソケットの作成に使用されます(ソケットを作成するには、サーバー側とクライアント側の両方で必要です)

socket.accept()

接続を受け入れるために使用されます。値のペア(conn、address)を返します。ここで、connはデータを送受信するための新しいソケットオブジェクトであり、addressは接続のもう一方の端にあるソケットのアドレスです。

socket.bind()

パラメータとして指定されたアドレスにバインドするために使用されます

socket.close()

ソケットを閉じたものとしてマークするために使用されます

socket.connect()

パラメータとして指定されたリモートアドレスに接続するために使用されます

socket.listen()

サーバーが接続を受け入れることができるようにします

ソケットモジュールの重要性を理解したので、次にソケットプログラミング用のサーバーとクライアントを作成するためにどのように役立つかを見てみましょう。 。

サーバーとは何ですか?

サーバーは、ネットワークリソースの管理に専念するプログラム、コンピューター、またはデバイスのいずれかです。サーバーは、同じデバイスまたはコンピューター上にあるか、他のデバイスおよびコンピューターにローカルに接続されているか、リモートに接続されている可能性があります。サーバーには、データベースサーバー、ネットワークサーバー、プリントサーバーなどさまざまな種類があります。

サーバーは通常、socket.socket()、socket.bind()、socket.listen()などのメソッドを使用して、接続を確立し、クライアントにバインドします。それでは、サーバーを作成するプログラムを作成しましょう。次の例を考えてみましょう。

例:

import socket s = socket.socket(socket.AF_INET、socket.SOCK_STREAM)s.bind((socket.gethostname()、1234))#ポート番号は0〜65535の範囲で指定できます(通常、非特権ポートを指定します。 > 1023)s.listen(5)while True:clt、adr = s.accept()print(f'Connection to {adr} Establishmentd ')#f stringは、fが前に付いた文字列であり、#中括弧内にpython式が含まれていますclt .send(bytes( 'Pythonでのソケットプログラミング'、 'utf-8'))#clientsocketに情報を送信する

ご覧のとおり、ソケットを作成する最初の必要性は、ソケットモジュールをインポートすることです。その後、socket.socket()メソッドを使用してサーバー側のソケットを作成します。

注意:

AF_INETはインターネットからのアドレスを参照し、ホストが特定のWebサイトのURLまたはそのアドレスであり、ポート番号が整数であるペア(ホスト、ポート)を必要とします。 SOCK_STREAMは、TCPプロトコルを作成するために使用されます。

bind()メソッドは、2つのパラメーター(ホスト、ポート)をタプルとして受け入れます。ただし、通常は下のポート番号が使用されるため、4桁のポート番号を使用することをお勧めします。 listen()メソッドを使用すると、サーバーは接続を受け入れることができます。ここで、5は同時に起動する複数の接続のキューです。ここで指定できる最小値は0です(小さい値を指定すると、0に変更されます)。パラメータが指定されていない場合は、デフォルトの適切なパラメータが使用されます。

ザ・ 接続を永久に受け入れることができます。 「clt」と「adr」はクライアントオブジェクトとアドレスです。 printステートメントは、クライアントソケットのアドレスとポート番号を出力するだけです。最後に、clt.sendを使用してデータをバイト単位で送信します。

サーバーがすべて設定されたので、クライアントに向かって進みましょう。

クライアントとは何ですか?

クライアントは、サーバーから情報またはサービスを受信するコンピューターまたはソフトウェアのいずれかです。クライアント/サーバーモジュールでは、クライアントはサーバーからのサービスを要求します。最良の例は、Google Chrome、FirefoxなどのWebブラウザです。これらのWebブラウザは、ユーザーの指示に従って、必要なWebページとサービスをWebサーバーに要求します。他の例には、オンラインゲーム、オンラインチャットなどが含まれます。

それでは、クライアント側プログラムをコーディングする方法を見てみましょう。 :

例:

import socket s = socket.socket(socket.AF_INET、socket.SOCK_STREAM)s.connect((socket.gethostname()、2346))msg = s.recv(1024)print(msg.decode( 'utf-8') )

最初のステップは、ソケットモジュールをインポートしてから、サーバーの作成時と同じようにソケットを作成することです。次に、クライアントサーバー間の接続を作成するには、(host、port)を指定してconnect()メソッドを使用する必要があります。


注意: gethostnameは、クライアントとサーバーが同じコンピューター上にある場合に使用されます。 (LAN – localip / WAN – publicip)

ここで、クライアントはサーバーから情報を受け取りたいと考えています。そのためには、recv()メソッドを使用する必要があり、情報は別の変数msgに格納されます。渡される情報はバイト単位であり、上記のプログラムのクライアントでは、1回の転送で最大1024バイト(バッファサイズ)を受信できることに注意してください。転送する情報量に応じて任意の量を指定できます。

最後に、転送されるメッセージをデコードして印刷する必要があります。

クライアントサーバープログラムの作成方法を理解したところで、次に、それらを実行する必要がある方法を確認しましょう。

エコークライアントサーバー:

これらのプログラムを実行するには、コマンドプロンプトを開き、クライアントおよびサーバープログラムを作成したフォルダーに移動して、次のように入力します。

py server.py(ここで、server.pyはサーバーのファイル名です。py-3.7server.pyを使用することもできます)

これが完了すると、サーバーは実行を開始します。クライアントを実行するには、別のcmdウィンドウを開き、次のように入力します。

py client.py(ここで、client.pyはクライアントのファイル名です)

出力(サーバー):

(クライアント)

SQLの*とは

バッファサイズを7に減らして同じプログラムを試して、どのような出力が得られるかを見てみましょう。

出力:

Pythonクラス__init__

ご覧のとおり、接続は7バイトを転送した後に終了します。ただし、完全な情報を受け取っておらず、接続が閉じられているため、これは問題です。この問題の解決に進みましょう。

複数のコミュニケーション:

クライアントが完全な情報を受信するまで接続を継続するには、whileループを使用できます。

例:

import socket s = socket.socket(socket.AF_INET、socket.SOCK_STREAM)s.connect((socket.gethostname()、2346))while True:msg = s.recv(7)print(msg.decode( 'utf- 8 '))

これを行うと、完全なメッセージが転送ごとに7バイトで受信されます。

しかし今回は、ご覧のとおり、接続は終了せず、いつ発生するかわかりません。さらに、クライアントがサーバーから受信するメッセージや情報の大きさが実際にわからない場合はどうでしょうか。このような場合、実際にはクライアント側で次のコードを使用できます。

例:

complete_info = '' while True:msg = s.recv(7)if len(msg)<=0: break complete_info += msg.decode('utf-8') print(complete_info) 

サーバー側では、次のようにclose()メソッドを使用します。

clt.close()

これの出力は、次の画像に示すようになります。

出力:



上記のコードブロックはすべて、情報のサイズを確認し、一度に2バイトのバッファに出力し、完了後に接続を閉じるだけです。

Pythonオブジェクトの転送:

ここまでは、文字列を転送するコツがあります。しかし、ソケットプログラミング Python Pythonオブジェクトを転送することもできます。これらのオブジェクトは、セット、タプル、辞書などのようなものにすることができます。これを実現するには、Pythonのpickleモジュールをインポートする必要があります。

Pythonピクルスモジュール:

Pythonでオブジェクトを実際にシリアル化または逆シリアル化するときに、Pythonpickleモジュールが登場します。小さな例を見てみましょう。

例:

import pickle mylist = [1,2、 'abc'] mymsg = pickle.dumps(mylist)print(mymsg)

出力: b’x80x03] qx00(Kx01Kx02Xx03x00x00x00abcqx01e。 ’

ご覧のとおり、上記のプログラムでは、「mylist」はpickleモジュールのdumps()関数を使用してシリアル化されています。また、出力は「b」で始まることに注意してください。これは、バイトに変換されることを意味します。ソケットプログラミングでは、このモジュールを実装して転送できます Pythonオブジェクト クライアントとサーバーの間。

pickleモジュールを使用してPythonオブジェクト構造を転送するにはどうすればよいですか?

ピクルスをソケットと一緒に使用すると、ネットワークを介して何でも絶対に転送できます。サーバー側とクライアント側の対応物を書き留めて、サーバーからクライアントにリストを転送しましょう。

サーバ側:

import socket import pickle a = 10 s = socket.socket(socket.AF_INET、socket.SOCK_STREAM)s.bind((socket.gethostname()、2133))#binding tuple s.listen(5)while True:clt、adr = s.accept()print(f '接続を{adr}確立')m = {1: 'クライアント'、2: 'サーバー'} mymsg = pickle.dumps(m)#後で出力するメッセージmymsg = {len(mymsg):{a}} 'utf-8')+ mymsg clt.send(mymsg)

ここで、mは基本的に サーバーからクライアントに送信する必要があります。これは、最初にdumps()を使用してオブジェクトをシリアル化し、次にそれをバイトに変換することによって行われます。
それでは、クライアント側の対応物を書き留めましょう。

クライアント側:

import socket import pickle a = 10 s = socket.socket(socket.AF_INET、socket.SOCK_STREAM)s.connect((socket.gethostname()、2133))while True:complete_info = b '' rec_msg = True while True:mymsg = s.recv(10)if rec_msg:print(f 'メッセージの長さ= {mymsg [:a]}')x = int(mymsg [:a])rec_msg = False complete_info + = mymsg if len(complete_info) -a == x:print( '完全な情報を受け取りました')print(complete_info [a:])m = pickle.loads(complete_info [a:])print(m)rec_msg = True complete_info = b '' print(complete_info )

最初のwhileループは、完全なメッセージ(complete_info)と、バッファーを使用して受信されているメッセージ(rec_msg)を追跡するのに役立ちます。 rec_を設定することによるメッセージ
次に、メッセージの受信中に、メッセージの各ビットを印刷し、サイズ10のバッファーで受信するだけです。このサイズは、個人の選択に応じて何でもかまいません。

次に、受信したメッセージが完全なメッセージと等しい場合は、受信した完全な情報としてメッセージを出力し、その後、loads()を使用してメッセージを逆シリアル化します。

上記のプログラムへの出力は次のとおりです。

これで、Pythonでのソケットプログラミングに関するこの記事は終わりです。すべての概念を明確に理解していただければ幸いです。

できるだけ練習し、経験を元に戻してください。

質問がありますか?この「Pythonでのソケットプログラミング」ブログのコメントセクションでそれについて言及してください。できるだけ早くご連絡いたします。

Pythonとそのさまざまなアプリケーションに関する詳細な知識を得るには、ライブに登録できます。 24時間年中無休のサポートと生涯アクセス。