ホームページ >バックエンド開発 >Python チュートリアル >Python の TCP チャットルーム
このブログでは、Python を使用して完全に機能する TCP チャットルームを実装します。ルームをホストする 1 つのサーバー と、それに接続して相互に通信する 複数のクライアント があります。
Transmission Control Protocol は、ネットワーク上のさまざまなデバイス間のメッセージ交換に役立つ、通信用の接続指向プロトコルです。
チャットルームの実装には、クライアントサーバーアーキテクチャを使用します。これは、複数のクライアント (ユーザー) と、すべてをホストし、これらのクライアントにデータを提供する 1 つの中央サーバーがあることを意味します。
1. ベースサーバーをセットアップするには、ソケットとスレッドという 2 つのライブラリをインポートする必要があります。ソケット ライブラリは、ネットワーク接続の確立と設定に使用され、スレッド ライブラリはさまざまなタスクを同時に実行するために必要です。
import socket import threading
2. 次のタスクは、サーバー データを定義し、ソケットを初期化することです。ホストの IP アドレスとサーバーの空きポート番号が必要です。このブログでは、アドレス 127.0.0.1、つまり localhost とポート 5500 を使用します。
ポート番号は関係ありませんが、使用しているポートが空いており、予約されていないであることを確認する必要があります。このチャットルームを実際のサーバーまたは仮想マシンで実行している場合は、チャットルーム サーバーの IP アドレスを仮想マシンまたはサーバーのホスト IP アドレス として指定します。
詳細については、この予約済みポート番号のリストを確認してください。
# Server Data host = '127.0.0.1' port = 5500
3. ソケットを定義するとき、2 つのパラメーターを渡す必要があります。これらは、使用するソケットのタイプを定義します。最初のソケット (AF_INET) は、UNIX ソケットではなくインターネット ソケットを使用していることを示します。 2 番目のパラメータは、使用するプロトコルを表します。 SOCK_STREAM は、TCP を使用していることを示します。
ソケットを定義した後、両方の値を含む タプル を渡すことで、ソケットをホストと指定されたポートにバインドまたはアタッチします。次に、サーバーをリスニング モードにして、クライアントが接続してメッセージを送信するのを待ちます。
# Start the Server server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host, port)) server.listen()
4. また、後で接続されたクライアントとそのニックネームを保存するために使用する 2 つの空のリストも作成します。
import socket import threading
5. 次に、メッセージのブロードキャストに役立つすべての関数を定義します。接続されているため、クライアント リストに存在する各クライアントにメッセージが送信されます。
# Server Data host = '127.0.0.1' port = 5500
6. 次に、handle() 関数を作成します。この関数は、クライアントからのメッセージを処理します。この関数は while ループで実行されます。この関数はクライアントをパラメータとして受け入れ、エラーが発生するかクライアント自体が切断されるまで無限ループで処理します。
# Start the Server server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host, port)) server.listen()
7. 次に、クライアントからメッセージを受信し、接続されているすべてのクライアントにブロードキャストする必要があります。したがって、1 人のクライアントがメッセージを送信すると、他のすべてのクライアントが、broadcast() 関数を介してこのメッセージを見ることができます。何らかの理由でこのクライアントへの接続にエラーが発生した場合は、クライアントとそのニックネームを削除し、接続を閉じて、このクライアントがチャットから退出したことをブロードキャストします。
# Lists For Clients and Their Nicknames clients = [] nicknames = []
サーバーを実行する準備ができたら、この受信関数を実行します。クライアントがサーバーに接続すると、文字列「NAME」がクライアントに送信され、ニックネームが要求されていることをクライアントに伝えます。その後、応答を待機し、それぞれのニックネームを持つクライアントをリストに追加し、その特定のクライアントの handle() 関数のスレッドを開始します。
8. これで、この関数を実行するだけでサーバーは完了です。
# Sending Messages To All Connected Clients def broadcast(message): for client in clients: client.send(message)
次に、クライアントを実装します。このために、同じライブラリを再度インポートする必要があります。
# Handling Clients def handle(client): while True: try: # Broadcasting Messages message = client.recv(1024) broadcast(message) except: # Removing And Closing Clients index = clients.index(client) clients.remove(client) client.close() nickname = nicknames[index] broadcast('{} left!'.format(nickname).encode('ascii')) nicknames.remove(nickname) break
1. クライアントの最初のステップは、ニックネームを選択し、サーバーに接続することです。サーバーが実行されている正確なアドレスとポートを知る必要があります。データをバインドしてリッスンする代わりに、クライアントとして既存のサーバーに接続します。
# Receiving `Function def receive(): while True: # Accept Connection client, address = server.accept() print("Connected with {}".format(str(address))) # Request And Store Nickname client.send('NAME'.encode('ascii')) nickname = client.recv(1024).decode('ascii') nicknames.append(nickname) clients.append(client) # Print And Broadcast Nickname print("Nickname is {}".format(nickname)) broadcast("{} joined!".format(nickname).encode('ascii')) client.send('Connected to server!'.encode('ascii')) # Start Handling Thread For Client thread = threading.Thread(target=handle, args=(client,)) thread.start()
2. ここで、クライアントには同時に実行される 2 つのスレッドが必要です。 1 つ目はサーバーからデータを常に受信し、2 つ目は独自のメッセージをサーバーに送信します。
receive()
ここでも無限の while ループが発生します。常にメッセージを受信して画面に出力しようとします。ただし、メッセージが「NAME」の場合、メッセージは出力されませんが、ニックネームがサーバーに送信されます。
書き込み機能は非常に短いものです。また、常にユーザーからの入力を待機する無限ループで実行されます。取得したら、ニックネームと組み合わせてサーバーに送信します。
3. 最後に行う必要があるのは、これら 2 つの関数を実行する 2 つのスレッドを開始することです。
import socket import threading
これで完了です。完全に機能するサーバーと、それに接続して相互に通信できる動作するクライアントがあります。
試運転に行きましょう。常に最初にサーバーを起動する必要があることに注意してください。そうしないと、クライアントは存在しないホストに接続できなくなります。
*サーバーログ: *
# Server Data host = '127.0.0.1' port = 5500
*クライアント 1 のログ : *
# Start the Server server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host, port)) server.listen()
*クライアント 2 のログ : *
# Lists For Clients and Their Nicknames clients = [] nicknames = []
ここで完全なコードを見つけます:https://github.com/rajatuiwebdev/tcp-chatroom-in-python
Instagram でフォローしてください: https://instagram.com/rajatrajput.dev
LinkedIn でフォローしてください: https://linkedin.com/in/rajatrajput2004
以上がPython の TCP チャットルームの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。