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