Python の TCP チャットルーム

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-04 19:16:40900ブラウズ

TCP Chatroom in Python

導入

このブログでは、Python を使用して完全に機能する TCP チャットルームを実装します。ルームをホストする 1 つのサーバー と、それに接続して相互に通信する 複数のクライアント があります。

TCP とクライアント サーバー アーキテクチャについて

Transmission Control Protocol は、ネットワーク上のさまざまなデバイス間のメッセージ交換に役立つ、通信用の接続指向プロトコルです。

チャットルームの実装には、クライアントサーバーアーキテクチャを使用します。これは、複数のクライアント (ユーザー) と、すべてをホストし、これらのクライアントにデータを提供する 1 つの中央サーバーがあることを意味します。


サーバーのセットアップ (server.py)

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)

クライアントのセットアップ ( client.py )

次に、クライアントを実装します。このために、同じライブラリを再度インポートする必要があります。

# 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 = []

そして、Python の伝送制御プロトコルに基づいたチャットルームを作成することに成功しました。 ? ?

ここで完全なコードを見つけます:https://github.com/rajatuiwebdev/tcp-chatroom-in-python
Instagram でフォローしてください: https://instagram.com/rajatrajput.dev
LinkedIn でフォローしてください: https://linkedin.com/in/rajatrajput2004

以上がPython の TCP チャットルームの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。