鱼C论坛

 找回密码
 立即注册
查看: 1690|回复: 3

一个EOFError

[复制链接]
发表于 2020-1-3 19:17:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python写了一个简易聊天室,server端运行的时候出现了一个EOFError好像不能接受input输入的信息?请问要怎么解决
  1. from socket import *
  2. import multiprocessing as mp
  3. import os,sys

  4. # 登录判断
  5. def do_login(s,user,name,addr):
  6.     if (name in user)  or  name == '管理员':
  7.         s.sendto("该用户已存在".encode(),addr)
  8.         return
  9.     s.sendto(b'OK',addr)

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

  16. # 转发聊天消息
  17. def do_chat(s,user,name,text,banned):
  18.     if name not in banned:
  19.         msg = "\n%s 说:%s"%(name,text)
  20.         for i in user:
  21.             if i != name:
  22.                 s.sendto(msg.encode(),user[i])

  23. # 退出聊天室
  24. def do_quit(s,user,name):
  25.     msg = '\n' + name + "退出了聊天室"
  26.     for i in user:
  27.         if i == name:
  28.             s.sendto(b'EXIT',user[i])
  29.         else:
  30.             s.sendto(msg.encode(),user[i])
  31.     # 从字典删除用户
  32.     del user[name]

  33. # 禁言功能
  34. def ban(s,user,name,banned):
  35.     banned.append(name)
  36.     for i in name:
  37.         if i==name:
  38.             msg = '您已被禁言'
  39.             s.sendto(msg.encode(),user[i])

  40. #解除禁言功能
  41. def release(s,user,name,banned):
  42.     banned.remove(name)
  43.     for i in name:
  44.         if i==name:
  45.             msg = '您已被解除禁言'
  46.             s.sendto(msg.encode(),user[i])


  47. # 接收客户端请求
  48. def do_parent(s):
  49.     while True:
  50.         msg,addr = s.recvfrom(1024)
  51.         msgList = msg.decode().split(' ')
  52.         
  53.         # 区分请求类型
  54.         if msgList[0] == 'L':
  55.             do_login(s,user,msgList[1],addr)
  56.         elif msgList[0] == 'C':
  57.             do_chat(s,user,msgList[1],\
  58.                 ' '.join(msgList[2:]),banned)
  59.         elif msgList[0] == 'Q':
  60.             do_quit(s,user,msgList[1])

  61. # 管理员功能
  62. def do_child(s,addr):
  63.     while True:
  64.         msg = input("管理员消息:")
  65.         if msg[0]=='@':
  66.             name = msg[1:]
  67.             ban(s,user,name,banned)
  68.         elif msg[0]=='#':
  69.             release(s,user,name,banned)
  70.         else:
  71.             msg = 'C 管理员 ' + msg
  72.             s.sendto(msg.encode(),addr)

  73. # 创建网络,创建进程,调用功能函数
  74. def main():
  75.     # server address
  76.     ADDR = ('0.0.0.0',8888)

  77.     # 创建套接字
  78.     s = socket(AF_INET,SOCK_DGRAM)
  79.     s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
  80.     s.bind(ADDR)

  81.     # 创建一个用户字典和一个禁言列表
  82.     user = mp.Manager().dict()
  83.     banned = mp.Array('u',[])
  84.    
  85.     # 创建一个单独的进程处理管理员喊话功能
  86.     p1 = mp.Process(target=do_parent,args=(s,))
  87.     p2 = mp.Process(target=do_child,args=(s,ADDR))

  88.     p1.start()
  89.     p2.start()
  90.     p1.join()
  91.     p2.join()

  92. if __name__ == "__main__":
  93.     main()
复制代码


2CBE42263A31700161137CE2FD5089F1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-1-3 19:21:24 | 显示全部楼层
本帖最后由 hrp 于 2020-1-3 19:50 编辑

子进程输入报错,只能在主进程input
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2020-1-3 19:25:14 | 显示全部楼层
hrp 发表于 2020-1-3 19:21
子进程输入报错,只能在父进程input

手滑点到反对了还取消不了…………你知道怎么修改不
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-3 19:54:04 | 显示全部楼层
oneMelon 发表于 2020-1-3 19:25
手滑点到反对了还取消不了…………你知道怎么修改不

不会多进程,坐等大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-21 16:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表