群聊服务端

    xiaoxiao2025-01-09  10

    """ 群聊服务端 Chat room env:python3.5 socket fork 练习 """ from socket import * import os,sys # 服务器地址 ADDR=('0.0.0.0',9898) # 存储用户信息 user={} # 用户注册并判断 def do_login(s,name,addr): if name in user or "管理员" in name: s.sendto("\n该用户已存在".encode(),addr) return s.sendto('OK'.encode(),addr) # 通知其他人 msg='欢迎%s进入聊天室'%name for key in user: s.sendto(msg.encode(), user[key]) # 将用户加入 user[name] = addr # 聊天 def do_chat(s,name,text): msg="\n%s : %s"%(name,text) for key in user: if key !=name: s.sendto(msg.encode(),user[key]) # 退出 def do_quit(s,name): msg="%s退出了聊天室"%name for key in user: if key != name: s.sendto(msg.encode(),user[key]) else: s.sendto(b'EXIT',user[key]) # 将用户删除 del user[name] # 接收各种客户端请求 def do_request(s): while True: data,addr=s.recvfrom(1024) # print(data.decode()) msg=data.decode().split(' ') # 区分请求类型 if msg[0]=='L': do_login(s,msg[1],addr) elif msg[0]=='C': # 将可能含有空格的消息拼接成字符串 text=' '.join(msg[2:]) do_chat(s,msg[1],text) elif msg[0]=='Q': if msg[1] not in user: s.sendto(b'EXIT',addr) continue do_quit(s,msg[1]) # 创建网络连接 def main(): # udp套接字 s=socket(AF_INET,SOCK_DGRAM) s.bind(ADDR) pid=os.fork() if pid<0: return # 发送管理员消息 elif pid==0: while True: msg=input("管理员消息:") msg="C 管理员 "+msg s.sendto(msg.encode(),ADDR) else: # 请求处理 do_request(s) # 处理客户端请求 if __name__=='__main__': main()
    最新回复(0)