paint-brush
Python でのソケット プログラミングの基本ガイド: クライアント、サーバー、およびピアツーピア ライブラリ@pubnub
4,597 測定値
4,597 測定値

Python でのソケット プログラミングの基本ガイド: クライアント、サーバー、およびピアツーピア ライブラリ

PubNub5m2023/03/06
Read on Terminal Reader

長すぎる; 読むには

このチュートリアルでは、Python ソケット プログラミングと Socket API を使用して、クライアントとサーバーの間でデータを交換する方法を学習します。このチュートリアルで使用されるソース コードは、[GitHub リポジトリ]:https://github.com/PubNubDevelopers/python-socket-demo にあります。
featured image - Python でのソケット プログラミングの基本ガイド: クライアント、サーバー、およびピアツーピア ライブラリ
PubNub HackerNoon profile picture
0-item

このチュートリアルでは、Python ソケット プログラミングと Socket API を使用して、クライアントとサーバーの間でデータを交換する方法を学習します。後で、このチュートリアルでは、ホストされたプロバイダーを使用して 2 つ以上の Python クライアント間でデータを直接交換する方法について説明します。このチュートリアルで使用されるソース コードは、 GitHub リポジトリ内にあります。


ソケット プログラミングは、2 つのソケット (クライアント ソケットとサーバー ソケット) を接続し、それらがリアルタイムで双方向に通信できるようにします。直接ソケット接続は、いつでもデータを送受信できるため、すべてのリアルタイム アプリケーションにメリットがあります。

環境設定

安定したバージョンのPython バージョン 3.x がマシンにインストールされている必要があります。 Windows ユーザーの場合は、Python を PATH に追加するオプションがあります。


このチュートリアルを進めるには、コード エディターも必要です。


Visual Studio Code は、 Python を含む多くの言語とフレームワークをサポートする、人気のあるオープン ソースの無料のコード エディターです。


VSCode は、Python の拡張機能もサポートしており、コードの補完とデバッグに役立ちます。

Python ソケット アプリケーションをビルドして実行する

Python を使用して簡単なソケット アプリケーションを作成しましょう。 Python はネイティブソケット クラス(ソケット モジュール) を提供するため、開発者は外部ライブラリに依存する必要がありません。まず、Python ソケット クライアントとサーバーをセットアップします。


Python ソケット スタック


プロジェクト ディレクトリにclient.pyファイルを作成します。ソケットを使用するには、Python ソケット ライブラリをインポートし、指定された IP アドレス (この場合はポート番号 8080 の localhost ですが、任意の ipv4 アドレスを選択できます) に接続する新しいソケット オブジェクトを作成します。


ソケット サーバーへの新しい接続を作成し、データを TCP サーバーに送信して、ソケット接続を閉じます。


client.pyファイルは次のようになります。


 import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('0.0.0.0', 8080)) client.send("I am CLIENT\n".encode()) from_server = client.recv(4096) client.close() print (from_server.decode())


クライアントからの着信接続とメッセージをリッスンするには、ソケット サーバーが必要です。


ファイルserver.pyを作成し、次の内容を追加します。


 import socket serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) serv.bind(('0.0.0.0', 8080)) serv.listen(5) while True: conn, addr = serv.accept() from_client = '' while True: data = conn.recv(4096) if not data: break from_client += data.decode('utf8') print (from_client) conn.send("I am SERVER\n".encode()) conn.close() print ('client disconnected and shutdown')


Server.pyポート 8080 でソケット オブジェクトをホスト名 (localhost) にバインドし、継続的に新しいクライアント接続をリッスンします。クライアントがこのアドレスに接続すると、サーバーは接続を受け入れ、データを読み取ります。


クライアントからデータが正常に読み取られると、サーバーはデータ応答を提供し、その時点でクライアントは接続を終了します。


これを自分でテストするには、2 つのターミナル ウィンドウを同時に開きます。 1 つのウィンドウで、次を実行します。


 python3 server.py


2 番目のウィンドウで、次を実行します。


 python3 client.py


サーバーは引き続き実行され、クライアントを実行して新しい出力を追加するたびに新しい接続が確立されることに注意してください。


クライアントは「I am CLIENT」という文字列をサーバーに送信し、応答を待ちます。サーバーはクライアントのメッセージを読み取り、端末に出力して、クライアントに応答を返します。


Python ソケットの例

PubNub を使用した Python でのソケット プログラミング

これまでのところ、このチュートリアルではサーバーとクライアント間のメッセージ交換について説明してきましたが、Python クライアント間で直接通信する必要がある場合はどうすればよいでしょうか?


2 つ以上のクライアント デバイス間でデータを直接送信することは、デバイスの数が増えるにつれて多くのスケーリングとセキュリティの考慮事項に直面するため、注意が必要です。


クライアント サーバー アーキテクチャは、クライアント間の通信を調整および管理するために使用されます。 Web サーバーを持っていない場合、またはアプリケーションの要求を満たすためにサーバーをスケーリングすることを心配している場合は、 PubNubなどのホストされたリアルタイム通信ソリューションを選択する必要があります。


Pythonを含む PubNub のクロスプラットフォーム SDK は、ユーザーを識別し、サブスクライブしたクライアントのみが受信する特定のチャネルにメッセージを送信できます。

クライアントからクライアントへの Python ソケット プログラミング

では、2 つのクライアント間で直接メッセージを交換するために、前に示した単純なアプリを PubNub でどのように作成すればよいでしょうか? PubNub は「パブリッシュ」および「サブスクライブ」アーキテクチャ (pub/sub) を使用してエンドポイント間で双方向メッセージを送受信しますが、バックグラウンドでソケットを使用することを理解することが不可欠です。 PubNub は、Python ネットワーク プログラミングの詳細を気にすることなく、オペレーティング システムに関係なくクライアント間の常時接続を維持することなく、ソケット通信の利点を提供します。


PubNub をプロジェクトに統合するには、ターミナルに pip を使用して PubNub パッケージをインストールします。これにより、 PubNub Python SDK を使用して、PubNub インフラストラクチャと通信できるようになります。


 pip3 install 'pubnub>=7.1.0'


PubNub ネットワークに接続して通信するには、2 つのクライアントを作成する必要があります。ファイルpn_client_1.pyを作成し、次のコードを追加します。


 from pubnub.callbacks import SubscribeCallback from pubnub.enums import PNStatusCategory from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub import time import os pnconfig = PNConfiguration() userId = os.path.basename(__file__) pnconfig.publish_key = 'demo' pnconfig.subscribe_key = 'demo' pnconfig.user_id = userId pnconfig.ssl = True pubnub = PubNub(pnconfig) def my_publish_callback(envelope, status): # Check whether request successfully completed or not if not status.is_error(): pass class MySubscribeCallback(SubscribeCallback): def presence(self, pubnub, presence): pass def status(self, pubnub, status): pass def message(self, pubnub, message): if message.publisher == userId : return print ("from device " + message.publisher + ": " + message.message) pubnub.add_listener(MySubscribeCallback()) pubnub.subscribe().channels("chan-1").execute() ## publish a message while True: msg = input("") if msg == 'exit': os._exit(1) pubnub.publish().channel("chan-1").message(str(msg)).pn_async(my_publish_callback)


ファイルpn_client_2.pyを作成し、 pn_client_1.pyに使用したのと同じコードを追加します。

上記のコードでは「デモ」キーを使用していますが、カスタム PubNub キーは無料で入手できます。


2 つの異なるターミナル ウィンドウでpn_client_1.pypn_client_2.pyの両方を同時に実行します。


 python3 pn_client_1.py


 python3 pn_client_2.py


各クライアントは、PubNub ネットワークへの接続を初期化し、サブスクライブして、新しいメッセージがchan-1チャネルにパブリッシュされるたびに受信します。これは、Python で TCP ソケットを介してデータを送信することと考えることができます。舞台裏では、PubNub がソケットを作成および管理し、メッセージをリッスンしているすべてのクライアントにメッセージをルーティングします。リモート クライアントがメッセージを受信すると、受信したメッセージがコマンド ラインに表示されます。


Python PubNub の例


それだけです。 PubNub を使用した開発の詳細については、さまざまなチュートリアルをご覧ください。または、 PubNub インタラクティブ ライブ ツアーをチェックして、プラットフォームがアプリケーションにリアルタイムのインタラクティブ性を提供する方法を理解してください。 PubNub は、Linux、Unix、および Windows と同様に、TCP および UDP データグラム通信をサポートしています。


ここでも公開されています: https://www.pubnub.com/blog/socket-programming-in-python-client-server-p2p/