我目前有一个套接字服务器,它接受来自4个不同客户端的连接,将它们保存到列表中,然后在客户端按下按钮时侦听客户端。
我可以连接所有客户端并将其存储到列表中指定的插槽中,但是,当我去收听客户端时,只能收听最后一个连接的客户端。
在连接客户端时,将存储以下内容:
c, addr = s.accept()
CLIENT_LIST["red1"] = c
CLIENT_LIST["red2"] = c
CLIENT_LIST["blue1"] = c
CLIENT_LIST["blue2"] = c
当客户端发送带有其播放器编号的消息,服务器将其读取为1,2,3,4并将其分配给相应的客户端列表时,此操作便完成了。我已确保此方面按设计工作。
然后,一旦所有客户端都连接好,我就开始进行while循环(简化)
msg= c.recv(1024)
print(msg)
但是,仅最后一个连接的客户端正在监听。
我还确保可以通过以下所有循环将垃圾邮件发送给客户端,从而使它们能够发送给客户端。
CLIENT_LIST["red1"].send('Red Team | Player One')
CLIENT_LIST["blue1"].send('Blue Team | Player One')
我尝试使用recvfrom明确声明我想收听的所有4个客户端,并将c.recv中的c更改为客户端列表名称。他们俩都没有工作。
我假设当下一个客户端连接时,它覆盖了c并导致了问题。但是我认为我可以通过将它们保存到列表中来解决这个问题。
当我拔头发时,任何帮助将不胜感激。
谢谢!
在与下面的Johhny交谈之后,我尝试将连接列表作为单独的线程收听,并且工作正常:
def ListenForRed1():
while True:
RedOneMessages = CLIENT_LIST["red1"].recv(1024)
print(RedOneMessages)
def ListenForBlue1():
while True:
BlueOneMessages = CLIENT_LIST["blue1"].recv(1024)
print(BlueOneMessages)
thread1 = Thread(target = ListenForRed1)
thread2 = Thread(target = ListenForBlue1)
thread1.start()
thread2.start()
是否有一种方法可以不必打开4个不同的线程并立即收听所有线程?
谢谢