私がこのコードで見ている問題は、動作しているにもかかわらず、このサーバに送信する情報クライアント(プレイヤ)の中には、両方ともrecvfrom()を持っているので、 'clientRequests'にあります。ですから、WHICH addrを指定することができれば、recvfrom()のパラメータとして情報が必要になります。私はそれがC++で可能だと信じていますが、それはPythonであり、どうですか? TCPではこの問題は存在しませんが、UDPを優先します。Python UDP recvfrom()特定のアドレス
次のようなものです:recvfrom(512、address =(ip、port))?
「アクセス許可」は、新しいクライアント接続を処理するために使用されます。
問題は、クライアントから送信された位置、イベントなどの情報が「許可」で処理されないことにあります。
class Server:
def __init__(self):
#host = '192.168.0.2'
host = '127.0.0.1'
port = 50007
addr = (host, port)
self.UDPSock = socket(AF_INET, SOCK_DGRAM)
self.UDPSock.bind(addr)
self.UDPSock.settimeout(5.0)
self.searchForClients = True
self.playersOnline = []
threading.Thread(target=self.permission).start()
Gui.add_event("Server online on port %s" % port)
def permission(self):
global _status
while self.searchForClients:
time.sleep(0.5)
_status.set("Status: Running; Connected: %s" % len(self.playersOnline))
try:
clientMessage, addr = self.UDPSock.recvfrom(1024) # , MSG_PEEK
except:
clientMessage = ""
if clientMessage == "CONNECT" and addr not in self.playersOnline:
if self.searchForClients:
self.addNewClient(addr)
elif clientMessage == "DISCONNECT" and addr in self.playersOnline:
self.removeClient(addr)
Gui.add_event("No longer accepting logins")
return False
def clientRequests(self, addr):
latestRequest = time.time()
while addr in self.playersOnline:
time.sleep(0.01)
try:
data, requestAddr = self.UDPSock.recvfrom(1024)
except:
requestAddr, data = "", ""
if requestAddr == addr:
latestRequest = time.time()
dataCommand = data.split(':')
if time.time() - latestRequest > 2:
if addr in self.playersOnline:
self.removeClient(addr)
if not self.searchForClients:
Gui.add_event("Player %s(%s) forcibly removed" % addr)
return False
これは実際に私が友達と一緒にやっているオンラインゲームプロジェクトです。各クライアントに1つのスレッドを持たせることが重要です。その1つのスレッドは、そのアドレスだけを聞くことができます。明らかにサーバークラス全体ではありません編集:私はconnect(2)ありがとうございます.. – KnasScripter
ちょうど提案 - 状態マシンの面でゲームについて考えてみてください。スレッドはfalseです。 –