|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
python写了一个简易聊天室,server端运行的时候出现了一个EOFError好像不能接受input输入的信息?请问要怎么解决- from socket import *
- import multiprocessing as mp
- 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[name] = addr
- # 转发聊天消息
- def do_chat(s,user,name,text,banned):
- if name not in banned:
- msg = "\n%s 说:%s"%(name,text)
- for i in user:
- if i != name:
- s.sendto(msg.encode(),user[i])
- # 退出聊天室
- def do_quit(s,user,name):
- msg = '\n' + 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 ban(s,user,name,banned):
- banned.append(name)
- for i in name:
- if i==name:
- msg = '您已被禁言'
- s.sendto(msg.encode(),user[i])
- #解除禁言功能
- def release(s,user,name,banned):
- banned.remove(name)
- for i in name:
- if i==name:
- msg = '您已被解除禁言'
- s.sendto(msg.encode(),user[i])
- # 接收客户端请求
- def do_parent(s):
- 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':
- do_chat(s,user,msgList[1],\
- ' '.join(msgList[2:]),banned)
- elif msgList[0] == 'Q':
- do_quit(s,user,msgList[1])
- # 管理员功能
- def do_child(s,addr):
- while True:
- msg = input("管理员消息:")
- if msg[0]=='@':
- name = msg[1:]
- ban(s,user,name,banned)
- elif msg[0]=='#':
- release(s,user,name,banned)
- else:
- msg = 'C 管理员 ' + msg
- s.sendto(msg.encode(),addr)
- # 创建网络,创建进程,调用功能函数
- def main():
- # server address
- ADDR = ('0.0.0.0',8888)
- # 创建套接字
- s = socket(AF_INET,SOCK_DGRAM)
- s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
- s.bind(ADDR)
- # 创建一个用户字典和一个禁言列表
- user = mp.Manager().dict()
- banned = mp.Array('u',[])
-
- # 创建一个单独的进程处理管理员喊话功能
- p1 = mp.Process(target=do_parent,args=(s,))
- p2 = mp.Process(target=do_child,args=(s,ADDR))
- p1.start()
- p2.start()
- p1.join()
- p2.join()
- if __name__ == "__main__":
- main()
复制代码
|
|