套接字服务器仅接受来自最后连接的客户端的MSG

时间:2019-12-09 20:36:04

标签: python sockets serversocket

我目前有一个套接字服务器,它接受来自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个不同的线程并立即收听所有线程?

谢谢

0 个答案:

没有答案