聊天室服务器

chatroom_server

#coding=utf-8
'''
Chatroom
env: python 3
socket and fork 
'''
from socket import *
import os,sys 

def do_login(s,user,name,addr):
   if (name in user)  or name == '管理员':
       s.sendto("该用户已存在".encode(),addr)
       return 

   s.sendto(b'OK',addr)

   #通知其他人
   msg = "\n欢迎 %s 进入聊天室"%name
   for i in user:
       s.sendto(msg.encode(),user[i])
   #将用户加入user
   user[name] = addr 

def do_chat(s,user,name,msg):
   msg = "\n%s 说: %s"%(name,msg)
   for i in user:
       if i != name:
           s.sendto(msg.encode(),user[i])

def do_quit(s,user,name):
   msg = "\n%s 退出了聊天室"%name 
   for i in user:
       if i == name:
           s.sendto(b'EXIT',user[i])
       else:
           s.sendto(msg.encode(),user[i])
   #从字典删除用户
   del user[name]

def do_request(s):
   # 存储结构 {'zhangsan':('127.0.0.1',9999)}
   user = {}
   while True:
       msg,addr = s.recvfrom(1024)
       msgList = msg.decode().split(' ')
       #区分请求类型
       if msgList[0] == 'L':
           do_login(s,user,msgList[1],addr)
       elif msgList[0] == 'C':
           #重新组织消息
           msg = ' '.join(msgList[2:])
           do_chat(s,user,msgList[1],msg) 
       elif msgList[0] == 'Q':
           do_quit(s,user,msgList[1])

#创建网络链接
def main():
   ADDR = ('0.0.0.0',8888)   
   #创建套接字
   s = socket(AF_INET,SOCK_DGRAM)
   s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
   s.bind(ADDR)
   
   #用于接受各种客户端请求,调用相应的函数处理
   
   pid = os.fork()
   if pid < 0:
       print("创建进程失败")
       return
   elif pid == 0:
       while True:
           msg = input("管理员消息:")
           msg = "C 管理员 " + msg 
           s.sendto(msg.encode(),ADDR)
   #父进程接收各种客户端请求
   else:
       do_request(s)


if __name__ == "__main__":
   main()



你可能感兴趣的:(聊天室服务器)