server3:

    1. # 导入套接字模块 socket
    2. import socket
    3. import threading
    4. # 维护一个列表,保存所有在线的客户端
    5. clients = []
    6. # 接收数据的线程
    7. def reciver_thread(client):
    8. while True:
    9. try:
    10. # 这个位置接收到某一个客户端的消息,需要进行转发
    11. msg = client.recv(100)
    12. # 遍历客户端,如果不是自己,就转发
    13. for i in clients:
    14. if i != client:
    15. i.send(msg)
    16. except Exception as e:
    17. # 直接在列表中删除当前的客户端
    18. for i in clients:
    19. if i == client:
    20. clients.remove(i)
    21. print(client.getpeername(), "下线了")
    22. break
    23. # main 函数,为主模块时执行
    24. def main():
    25. # 1. 创建一个用于网络连接的套接字,使用 TCP 协议
    26. server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    27. # 2. 绑定套接字到执行的 ip 和 端口,必须是元组
    28. server.bind(("127.0.0.1", 0x1616))
    29. # 3. 设置套接字为监听状态,同一时刻能接收的数量
    30. server.listen(socket.SOMAXCONN)
    31. # 4. 循环等待客户端的连接
    32. while True:
    33. # 连接到的客户端,输出它的地址
    34. client, address = server.accept()
    35. # 将连接上的客户端添加到在线列表中
    36. clients.append(client)
    37. print(address, "上线了")
    38. # 每一个客户端都应该有一个独立的接收数据的线程
    39. threading.Thread(target=reciver_thread, args=(client,)).start()
    40. if __name__ == "__main__":
    41. main()