版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么用python代码实现简易聊天室
这篇文章主要介绍了怎么用python代码实现简易聊天室的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用python代码实现简易聊天室文章都会有所收获,下面我们一起来看看吧。1.功能:类似qq群聊功能1.有人进入聊天室需要输入姓名,姓名不能重复2.有人进入聊天室,其他人会受到通知xxx进入聊天室3.一个人发消息,其他人会受到消息xxx:xxxxxxxx4.有人退出聊天室,其他人也会收到通知xxx退出聊天室5.扩展功能:服务端消息公告,服务端发送消息所有人都能收到管理员消息:xxxxxxxx2.确定技术模型1.服务端和客户端服务端处理请求,发送管理员消息客户端执行各种功能2.套接字选择:udp套接字3.消息发送模型:转发客户端~>服务端~>其他客户端4.存储用户信息:{name:addr}5.处理收发关系:多进程分别处理收发3.注意事项1.设计封装方案2.写一个功能模块测试一个模块3.注意注释的添加#coding
=utf-8
"""
chat
room
env:python3.5
exc:socket
and
fork
name:mianmabb
email:mianmabb@163.com
服务端功能:
1.搭建网络通信
2.处理进入聊天室
*
接收姓名
*
判断是否允许进入
*
将结果反馈给客户端
*
如果不允许则结束,允许则将用户插入数据结构
*
给其他人发送通知
3.处理聊天
*
接收消息,判断消息类型,分为L(输入姓名),C(发消息),Q(退出聊天室)
*
将消息转发
4.处理退出聊天室
5.发送管理员消息
"""
from
socket
import
*
from
os
import
*
from
sys
import
*
user
=
{}
#创建空字典用来存储用户的昵称和地址
#处理登录
def
do_login(s,name,addr):
if
name
in
user:
#判断昵称是否已经存在
s.sendto("该昵称已被占用".encode(),addr)
return
else:
#昵称不存在,则发送约定好的"OK"
s.sendto(b"OK",addr)
#功能:有人进入聊天室,其他人会收到消息
msg
=
"
欢迎
%s
进入聊天室
"%name
for
i
in
user:
#发送该条消息给其他用户
s.sendto(msg.encode(),user[i])
user[name]
=
addr
#将该用户插入数据结构(字典)
#处理聊天
def
do_chat(s,name,text):
msg
=
"%s
:
%s"%(name,text)
#设置消息显示格式
for
i
in
user:
s.sendto(msg.encode(),user[i])
#处理退出
def
do_quit(s,name):
msg
=
"%s
退出了聊天室"%name
for
i
in
user:
if
i
!=
name:
#给其他人发送该用户退出的消息
s.sendto(msg.encode(),user[i])
else:
#给该用户客户端发送约定好的EXIT让父进程退出
s.sendto(b"EXIT",user[i])
del
user[name]
#删除字典中该用户
#处理请求
def
do_request(s):
#循环接受所有客户请求
while
True:
try:
data,addr
=
s.recvfrom(1024)
except
KeyboardInterrupt:
#捕获父进程直接退出错误
exit("服务端退出!")
#
print(data.decode())
msgList
=
data.decode().split()
#按空格拆分为列表,方便索引
if
msgList[0]
==
"L":
#判断消息类型
do_login(s,msgList[1],addr)
elif
msgList[0]
==
"C":
text
=
"
".join(msgList[2:])
#将消息中可能有的空格加回来
do_chat(s,msgList[1],text)
elif
msgList[0]
==
"Q":
do_quit(s,msgList[1])
def
main():
s
=
socket(AF_INET,SOCK_DGRAM)
ADDR
=
("",8888)
s.bind(ADDR)
#创建进程
pid
=
fork()
if
pid
<
0:
print("Error")
elif
pid
==
0:
#子进程用来发送管理员消息
while
True:
try:
text
=
input("管理员
:
")
except
KeyboardInterrupt:
#捕获子进程直接退出错误
exit()
msg
="C
管理员
%s"%text
s.sendto(msg.encode(),ADDR)
else:
#父进程用来处理请求
do_request(s)
main()客户端功能:"""
1.搭建通信
2.进入聊天室
*
输入姓名
*
发送给服务器
*
接收服务器反馈
*
不允许则重新输入,允许则进入聊天室
*
创建新的进程用于消息收发
3.聊天
*
循环发送消息
消息类型分为L(输入姓名),C(发消息),Q(退出聊天室)
*
循环接收消息
4.退出聊天室
5.接受管理员消息
"""
from
socket
import
*
from
os
import
*
from
sys
import
*
ADDR
=
("",8888)
#填写服务端地址
#循环发送消息
def
send_msg(s,name):
while
True:
try:
text
=
input()
#客户输入要发送的消息
except
KeyboardInterrupt:
#子进程
防止用户Ctrl+C直接退出
text
=
"quit"
if
text.strip()
==
"quit":
#规定输入quit退出
msg
=
"Q
"
+
name
#消息类型,姓名
s.sendto(msg.encode(),ADDR)
exit("您已退出聊天室")
else:
msg
=
"C
%s
%s"%(name,text)
#消息类型,姓名,消息
s.sendto(msg.encode(),ADDR)
#循环接收信息
def
recv_msg(s):
while
True:
try:
data,addr
=
s.recvfrom(1024)
except
KeyboardInterrupt:
#父进程
防止用户Ctrl+C直接退出
exit()
if
data.decode()
=="EXIT":
#当用户退出,无需再收消息,约定EXIT让父进程退出
exit()
#退出父进程
print(data.decode())
#创建网络连接
def
main():
s
=
socket(AF_INET,SOCK_DGRAM)
while
True:
name
=
input("请输入昵称:")
#输入姓名
if
not
name:
return
msg
=
"L
"
+name
#发送请求
s.sendto(msg.encode(),ADDR)
#等待回复
data,addr
=
s.recvfrom(1024)
if
data.decode()
==
"OK":
print("您已进入聊天室")
break
else:
#登录失败
print(data.deco
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 董事长年会工作报告5篇
- 20XX试用期劳动合同模板5篇
- 物业公司介绍
- 小学六年级美术下册教案全集
- 放射性金属矿相关项目投资计划书范本
- 土元相关行业投资方案范本
- 密闭式鸡舍光周期自动控制设备相关项目投资计划书
- 特种工种人员报审表
- 天气预报技术与方法
- 外研社小学三年英语上Module5Unit 2 Nine girls
- 机械行业机器人系列报告七:空心杯电机专题机器人手部核心零部件国内厂商迎替代机遇
- 寻猫启事标准范文
- 洁净室净化工程施工方案
- 福建省宁德市部分达标学校2022-2023学年高三上学期11月期中联考英语试题(Word版含答案含听力音频)
- 专题复习非连续性文本阅读公开课一等奖市优质课赛课获奖课件
- 《永远永远爱你》绘本(课件)(32) 通用版美术
- 2023学年完整公开课版感叹号
- 绘本阿比忘了什么
- 《有多少浪费本可避免》评课稿
- 《一次函数》单元教学设计
- 2023年江苏省南通市如东县、通州区中考数学一模试卷(含解析)
评论
0/150
提交评论