私はいくつかのRaspberry Pis、Python、いくつかのボタン/スイッチを使ってゲームを行ってきました。私のゲームでは、複数のクライアントにコマンドを発行する中央サーバーが必要です。Python TCP Server接続とブロードキャストコマンドを受け入れる
私はプログラミングには新しくないが、Pythonや低レベルのネットワーク通信には新しくなく、サーバーコードの正確な記述方法について過去2日間は雑草で失われている。
クライアントプログラムは単純なsocket.connectで、データの送信を待機します。そこに問題はありません。
私は、サーバーの作成方法と作成方法を正確に判断するのに苦労しました。ここで
は私のサーバーコードは、現時点では次のようになります。 1.サーバーが起動して待機最初の接続以上:
import socket, time, sys
import threading
TCP_IP = ''
TCP_PORT = 8888
BUFFER_SIZE = 1024
CLIENTS = {}
clientCount = 0
def listener():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP,TCP_PORT))
s.listen(5)
while True:
conn, addr = s.accept()
print("new connection from:"+ str(addr))
#print(len(CLIENTS))
global clientCount
clientCount = clientCount+1
print (clientCount)
# register client
CLIENTS[conn.fileno()] = conn
def broadcast():
for client in CLIENTS.values():
client.send('this is a broadcats msg')
if __name__ == '__main__':
listener()
while clientCount > 0:
broadcast()
print(len(CLIENTS)) #print out the number of connected clients every 5s
time.sleep(5)
ここで所望の流れです。私はこの "サーバ"はバックグラウンドスレッドで実行されるべきだと思いますか? 2. connectionCount > 0
がメインプログラムループを開始する場合 3.メインプログラムループは、接続されたクライアントの数を表示し、5秒ごとにすべてのクライアントにメッセージをブロードキャストするだけです。
私はこのサーバーのバージョンが約5つあります。私は非同期、select.select、およびいくつかのスレッド・アプローチを試みましたが、私が求めている振る舞いを釘付けにすることはできません。サーバーをバックグラウンドスレッドにする必要がありますか?もしそうなら、どのようにすべての接続にブロードキャストするのですか?
私が試したことのない唯一のことは、ツイストされています。なぜなら、それはWindowsにインストールされていなかったからです...私はそのoptinoを現時点で支配しています。誰かがこれに行く場所にポインタを持っているなら、私は本当にそれを感謝します!
更新
[OK]を、@Armansの提案に基づいてサーバクラスがあるように私は自分のコードを更新したが、それはまだ同じことを実行します。
class server():
def __init__(self):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP,TCP_PORT))
s.listen(10)
while 1:
client_socket, addr = s.accept()
print ('Connected with ' + addr[0] + ':' + str(addr[1]))
global clientCount
clientCount = clientCount+1
print (clientCount)
# register client
CLIENTS[client_socket.fileno()] = client_socket
threading.Thread(target=self.handler, args=(client_socket, addr)).start()
def handler(self, client_socket, addr):
while 1:
data = client_socket.recv(BUFFER_SIZE)
print ('Data : ' + repr(data) + "\n")
data = data.decode("UTF-8")
def broadcast(self, message):
for c in self.CLIENTS:
c.send(message.encode("utf-8"))
if __name__ == '__main__':
s = server() #create new server listening for connections
while clientCount > 0:
s.broadcast('msg here')
print(len(CLIENTS)) #print out the number of connected clients every 5s
time.sleep(5)
私は複数のクライアントを接続することができ、コンソールには次のように表示されます。
Connected with 10.0.0.194:38406
1
Connected with 10.0.0.169:36460
2
しかし、「しばらくclientCount」ループが実行されることはありませんのコード。これは私がしばらくの間立ち往生していたゾーンなので、ここに何か考えてみたいと思っています。