Python - 套接字 - 向所有客户端发送消息 - 列出超出范围的索引



我有一个 server.py 文件,它应该处理多个客户端(有点像聊天),但是如果我尝试将从客户端收到的消息发送到其余客户端,则会出现list index out of range错误。

错误在第 15 行引发 - 在 for 循环中

这是我的 server.py:

import socket
import threading
DEFAULT_SIZE = 256
client_list = []

def handle_client(connection, client_id):
    client_name = receive_message(connection, DEFAULT_SIZE)
    while 1:
        message = receive_message(connection, DEFAULT_SIZE)
        print("%s: %s" % (client_name, message))
        for c in client_list:
            connection = c[0]
            connection.sendall(client_name.encode())
            connection.sendall(message.encode())

def receive_message(connection, size):
    message = connection.recv(size)
    return message.decode("UTF-8")
server_address = ("localhost", 4000)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(server_address)
print("Server bound. Now waiting for connections...n")
server.listen(5)
i = 0
while 1:
    client_list.append([])
    client, address = server.accept()
    client_list[i].append(client)
    client_list[i].append(address)
    print("[New connection from %s]:" % client_list[i][1][0])
    thread = threading.Thread(target=handle_client, args=(client_list[i][0], i))
    thread.start()
    i += 1
server.close()

代码中存在争用条件:

while 1:
    client_list.append([])
    client, address = server.accept()
    client_list[i].append(client)
    client_list[i].append(address)

将一个空列表附加到client_list;然后accept入站连接;当收到新连接时,将它们的详细信息放在列表中。但是当该线程位于 accept 中时,另一个正在访问client_list的线程现在将看到一个刚刚[]的项目;众所周知:

>>> [][0]
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
IndexError: list index out of range

当该异常打印到终端时,发生错误的客户端线程也将终止。


解决方案是在accept之后附加客户端结构,并且仅在所有数据都存在之后:

while 1:
    client, address = server.accept()
    client_info = [client, address]
    client_list.append(client_info)

相关内容

最新更新