怎么用python代码实现简易聊天室
怎么用python代码实现简易聊天室
这篇文章主要介绍了怎么用python代码实现简易聊天室的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用python代码实现简易聊天室文章都会有所收获,下面我们一起来看看吧。
1.功能:类似qq群聊功能
1.有人进入聊天室需要输入姓名,姓名不能重复
2.有人进入聊天室,其他人会受到通知
xxx进入聊天室
3.一个人发消息,其他人会受到消息
xxx:xxxxxxxx
4.有人退出聊天室,其他人也会收到通知
xxx退出聊天室
5.扩展功能:服务端消息公告,服务端发送消息所有人都能收到
管理员消息:xxxxxxxx
2.确定技术模型
1.服务端和客户端
服务端处理请求,发送管理员消息
客户端执行各种功能
2.套接字选择:udp套接字
3.消息发送模型:转发
客户端 ~> 服务端 ~> 其他客户端
4.存储用户信息:{name:addr}
5.处理收发关系:多进程分别处理收发
3.注意事项
1.设计封装方案
2.写一个功能模块测试一个模块
3.注意注释的添加
#coding=utf-8"""chatroomenv:python3.5exc:socketandforkname:mianmabbemail:mianmabb@163.com服务端功能:1.搭建网络通信2.处理进入聊天室*接收姓名*判断是否允许进入*将结果反馈给客户端*如果不允许则结束,允许则将用户插入数据结构*给其他人发送通知3.处理聊天*接收消息,判断消息类型,分为L(输入姓名),C(发消息),Q(退出聊天室)*将消息转发4.处理退出聊天室5.发送管理员消息"""fromsocketimport*fromosimport*fromsysimport*user={}#创建空字典用来存储用户的昵称和地址#处理登录defdo_login(s,name,addr):ifnameinuser:#判断昵称是否已经存在s.sendto("该昵称已被占用".encode(),addr)returnelse:#昵称不存在,则发送约定好的"OK"s.sendto(b"OK",addr)#功能:有人进入聊天室,其他人会收到消息msg="欢迎%s进入聊天室"%nameforiinuser:#发送该条消息给其他用户s.sendto(msg.encode(),user[i])user[name]=addr#将该用户插入数据结构(字典)#处理聊天defdo_chat(s,name,text):msg="%s:%s"%(name,text)#设置消息显示格式foriinuser:s.sendto(msg.encode(),user[i])#处理退出defdo_quit(s,name):msg="%s退出了聊天室"%nameforiinuser:ifi!=name:#给其他人发送该用户退出的消息s.sendto(msg.encode(),user[i])else:#给该用户客户端发送约定好的EXIT让父进程退出s.sendto(b"EXIT",user[i])deluser[name]#删除字典中该用户#处理请求defdo_request(s):#循环接受所有客户请求whileTrue:try:data,addr=s.recvfrom(1024)exceptKeyboardInterrupt:#捕获父进程直接退出错误exit("服务端退出!")#print(data.decode())msgList=data.decode().split()#按空格拆分为列表,方便索引ifmsgList[0]=="L":#判断消息类型do_login(s,msgList[1],addr)elifmsgList[0]=="C":text="".join(msgList[2:])#将消息中可能有的空格加回来do_chat(s,msgList[1],text)elifmsgList[0]=="Q":do_quit(s,msgList[1])defmain():s=socket(AF_INET,SOCK_DGRAM)ADDR=("0.0.0.0",8888)s.bind(ADDR)#创建进程pid=fork()ifpid<0:print("Error")elifpid==0:#子进程用来发送管理员消息whileTrue:try:text=input("管理员:")exceptKeyboardInterrupt:#捕获子进程直接退出错误exit()msg="C管理员%s"%texts.sendto(msg.encode(),ADDR)else:#父进程用来处理请求do_request(s)main()
客户端功能:
"""1.搭建通信2.进入聊天室*输入姓名*发送给服务器*接收服务器反馈*不允许则重新输入,允许则进入聊天室*创建新的进程用于消息收发3.聊天*循环发送消息消息类型分为L(输入姓名),C(发消息),Q(退出聊天室)*循环接收消息4.退出聊天室5.接受管理员消息"""fromsocketimport*fromosimport*fromsysimport*ADDR=("127.0.0.1",8888)#填写服务端地址#循环发送消息defsend_msg(s,name):whileTrue:try:text=input()#客户输入要发送的消息exceptKeyboardInterrupt:#子进程防止用户Ctrl+C直接退出text="quit"iftext.strip()=="quit":#规定输入quit退出msg="Q"+name#消息类型,姓名s.sendto(msg.encode(),ADDR)exit("您已退出聊天室")else:msg="C%s%s"%(name,text)#消息类型,姓名,消息s.sendto(msg.encode(),ADDR)#循环接收信息defrecv_msg(s):whileTrue:try:data,addr=s.recvfrom(1024)exceptKeyboardInterrupt:#父进程防止用户Ctrl+C直接退出exit()ifdata.decode()=="EXIT":#当用户退出,无需再收消息,约定EXIT让父进程退出exit()#退出父进程print(data.decode())#创建网络连接defmain():s=socket(AF_INET,SOCK_DGRAM)whileTrue:name=input("请输入昵称:")#输入姓名ifnotname:returnmsg="L"+name#发送请求s.sendto(msg.encode(),ADDR)#等待回复data,addr=s.recvfrom(1024)ifdata.decode()=="OK":print("您已进入聊天室")breakelse:#登录失败print(data.decode())#直接打印服务端的错误信息#创建进程pid=fork()ifpid<0:print("Error")elifpid==0:#子进程发消息send_msg(s,name)else:#父进程收消息recv_msg(s)main()
先运行服务端,再运行客户端
关于“怎么用python代码实现简易聊天室”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用python代码实现简易聊天室”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...
-
Python如何利用D3Blocks绘制可动态交互的图表
-
2021年度编程语言揭晓
-
PPython:PHP 拥抱 Python 的利器
-
哪种Python IDE最适合你?这里有一份优缺点列表
-
Python分隔字符串函数用法split
aaa,bbb=str.split(‘&&’,2)第一个参数为分隔符第二个参数是要完成的最大拆分数...
-
php安全编程——python测试实例编写
-
神奇的Python模块:pdfkit,将Python抓取的网址内容保存pdf文件