"""
群聊服务端
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()