server3:
# 导入套接字模块 socket
import socket
import 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()