聊天室服务器

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()



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值