1

私は最初に周りを見回しましたが、私の質問に答えるものは何も見つかりませんでした.

問題は、ちょっとしたチャット プログラムを作っていたことです。そして、いくつかのチュートリアルを見て、いくつかのドキュメントに従った後、次のように機能するチャット プログラムを作成することができました。

クライアントとクライアント/サーバーがあります。クライアント/サーバーは基本的に自分自身をサーバーとして設定し、クライアントに応答することもできます。

そのため、ユーザーが識別した特定のポートでリッスンし、クライアント接続を受け入れます。

問題は、これを少し変えたいと思ったことです。

クライアント/サーバーを持つのではなく。2 つのクライアントと、両方のクライアント間のスイッチボードとして機能するサーバーが必要です。基本的に、すべてのチャットを接続されたアドレスに転送します。

ここで私は少し困惑しています:

HOST = input("Please define the host IP, if over local, name 'localhost': ")
PORT = int(input("Please define the port to be communicated over: "))
if PORT == False:
    PORT = 4010


s = socket(AF_INET,SOCK_STREAM)#AF_INET and SOCK_STREAM are standard. 
s.bind((HOST,PORT))# The socket is being bound, or assigned, the ip of the server, as well as the communicating port.
s.listen(2)#Accepting only a single connection. EDIT: Now two connections.
conn,addr = s.accept()


print("\nNetwork activity from address: ",addr,)

# Section two: Communications Loop.

問題は、s.listen(2)2 つの接続を取るように編集されていることですが、別の接続の接続を管理したり、それらに変数を割り当てたりして、配電盤を機能させるにはどうすればよいでしょうか?

これが重複したスレッドであることがわかった場合は、リンクを投稿してください。このスレッドを削除して、最初にそこを読むことができるかどうかを確認します. (申し訳ありませんが、ここに投稿する前にひどい経験をしました(理由がわからないため、投票しました))

4

1 に答える 1

0

listen パラメーターは、受け入れられる接続の数ではなく、保留できる接続の数を示します。

select モジュールを使用する必要があります。これにより、ファイル記述子のリストを挿入し、どの記述子が入力または出力の準備ができているかを確認できます。

次に、開いている接続 (最初は空) のリストと、select に渡すソケット s を取得し、データを読み取り、他のすべての接続に書き込み、永久にループする必要があります。

import select

connections = []

while True:
    rlist,wlist,xlist = select.select(connections + [s],[],[])
    for i in rlist:
        if i == s:
            conn,addr = s.accept()
            connections.append(conn)
            continue
        data = i.recv(1024)
        for q in connections:
            if q != i and q != s:
                q.send(data)

このコードはノンブロッキング モードを使用する複雑さを考慮していないため、1 つの遅いクライアントは他のすべてのクライアントの速度も低下させますが、一般的には動作するはずです。

于 2013-03-05T09:43:55.393 に答える