我有一个 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)