类似群聊

需求

  • 有人进入聊天室需要输入姓名,姓名不能重复
  • 有人进入聊天室时,其他人会收到通知:xxx 进入了聊天室
  • 一个人发消息,其他人会收到:xxx : xxxxxxxxxxx
  • 有人退出聊天室,则其他人也会收到通知:xxx退出了聊天室

技术分析

客户端/服务端

client/server

存储人员信息: 服务端存什么 : 名字  地址怎么存 : {name:address}[(name,address),...]class Person:def __init__(self,name,address):self.name = nameself.address = address消息的网络传递 : udp消息发送:转发的方法   客户端-》服务端-》客户端收发消息: 多进程,一个负责发送,一个负责接收
功能模块划分 封装方法 : 函数封装
框架模型进入聊天室聊天退出聊天室
网络协议设置
       请求类型     数据参量
进入     LOGIN      name聊天     CHAT       name  说话的内容退出     EXIT
功能模块逻辑具体分析
框架模型服务端 : 1. 创建udp网络服务端2. 循环接收各种客户端请求3. 根据请求做出调用客户端 : 1. 创建udp网络进入聊天室客户端 : 1. 输入姓名2. 发送给服务端3. 接收服务端反馈4. YES 进入聊天 NO 回到第一步服务端 : 1. 接收请求2. 判断是否有这个姓名3. 根据判断发送结果YES -》存储用户 告知其他人NO -》over聊天客户端 :1. 创建子进程2. 父进程循环发送消息子进程循环接收消息服务端 : 1. 接收请求2. 将消息转发给其他人退出聊天室客户端 1. 输入EXIT 表示退出2. 发送请求服务端 1. 接收请求2. 告知其他人3. 删除该用户
  • 后续可继续优化完善
客户端代码如下:
# -*- coding: UTF-8 -*-
'''
PyCharm
@Project :群聊聊天室
@File    :chat_client.py
@Author  :
@Date    :2020/10/24
'''
"""群聊 客户端代码
"""from socket import *
from multiprocessing import Process
import sys# 服务器地址
ADDR = ('127.0.0.1', 8888)# 处理登录
def login(socketed):while True:# 进入聊天室name = input('用户名:>>>')# 发送姓名msg = 'LOGIN ' + namesocketed.sendto(msg.encode(), ADDR)# 接收结果data, address = socketed.recvfrom(1024)if data.decode() == 'YES':print('进入聊天室')return nameelse:print('用户已存在')# 接收消息
def chat(socketed):while True:data, address = socketed.recvfrom(1024 * 10)# 美化打印内容msg = "\n" + data.decode() + "\n发言:"print(msg, end="")  # end="" 不换行# 发送消息
def receive(socketed, name):while True:# try 处理异常退出try:news = input('发言:')except KeyboardInterrupt:news = 'EXIT'if news == 'EXIT':msg = 'EXIT ' + namesocketed.sendto(msg.encode(), ADDR)sys.exit('已退出聊天室')msg = 'CHAT %s %s' % (name, news)socketed.sendto(msg.encode(), ADDR)# 程序启动函数
def main():socketed = socket(AF_INET, SOCK_DGRAM)# socketed.bind(('0.0.0.0', 2222))  # 确保地址不会变化name = login(socketed)  # 进入聊天室# 创建子进程 用于接收消息process = Process(target=chat, args=(socketed,))process.daemon = True  # 父进程退出子进程也退出process.start()# 父进程发送消息receive(socketed, name)socketed.close()process.join()if __name__ == '__main__':main()
服务端代码如下:
# -*- coding: UTF-8 -*-
'''
PyCharm
@Project :群聊聊天室
@File    :chat_server.py
@Author  :
@Date    :2020/10/24
'''
"""群聊  服务端
"""from socket import *
from multiprocessing import Process# 服务器地址
HOST='0.0.0.0'
PORT= 8888
ADDR = (HOST,PORT)
# 用字典储存用户
user = {}  # 储存用户信息 {name:address}# 处理进入聊天室
def login(socketed, name, address):if name in user or '管理' in name:socketed.sendto('NO'.encode(), address)else:socketed.sendto('YES'.encode(), address)# 循环通知其他人msg = '欢迎%s进入聊天室' % namefor other in user:socketed.sendto(msg.encode(), user[other])user[name] = address  # 增加该用户# 处理聊天
def chat(socketed, name,content):msg = "%s : %s" % (name, content)for other in user:if other == name:continue  # 除去自己socketed.sendto(msg.encode(), user[other])# 处理退出
def exits(socketed, name):del user[name]  # 删除用户msg = '%s退出聊天室' % namefor other in user:socketed.sendto(msg.encode(), user[other])# 处理客户端请求
def request(socketed):# 循环接收各种客户端请求while True:# 接收所有客户端请求data, address = socketed.recvfrom(1024)# 对数据结构进行简单解析tmp = data.decode().split(' ',2)if tmp[0] == 'LOGIN':# tmp---> ['LOGIN','name']# 进入函数login(socketed, tmp[1], address)elif tmp[0] == 'CHAT':# tmp---> ['LOGIN','name','news']#  聊天函数chat(socketed, tmp[1],tmp[2])elif tmp[0] == 'EXIT':# 退出函数exits(socketed, tmp[1])# 程序启动函数
def main():# UDP套接字socketed = socket(AF_INET, SOCK_DGRAM)socketed.bind(ADDR)# 创建子进程process=Process(target=request,args=(socketed,))process.daemon=True # 父进程退出子进程也退出process.start()while True:# 发送管理员消息content = input("管理员消息:")# 服务端退出if content == "EXIT":breakmsg = "CHAT 管理员消息: "+content# 从父进程发送给子进程socketed.sendto(msg.encode(),ADDR)if __name__ == '__main__':main()
  • 执行需先执行服务端后再执行客户端

Python3群聊聊天室相关推荐

  1. 使用UDP实现群聊聊天室

    今天为大家带来了一个非常有意思的小程序--UDP实现的群聊聊天室.这个程序使用的UDP协议,并使用DatagramSocket的子类MulticastSocket实现组播,可以部署在一个局域网内的多台 ...

  2. UDP实现群聊聊天室

    UDP实现群聊聊天室 ​ 大家好,今天为大家带来了一个非常有意思的小程序--UDP实现的群聊聊天室.这个程序使用的UDP协议,并使用DatagramSocket的子类MulticastSocket实现 ...

  3. 基于UDP的群聊聊天室

    这是一个最近写的小项目,想要总结一下,如有不合理地方,请多指教! 一.项目名称 基于UDP的群聊聊天室 二.实现功能: 1.有新用户登录,其他在线的用户可以收到登录信息 2.有用户群聊,其他在线的用户 ...

  4. Java培训:UDP实现群聊聊天室

    大家好,今天为大家带来了一个非常有意思的小程序--UDP实现的群聊聊天室.这个程序使用的UDP协议,并使用DatagramSocket的子类MulticastSocket实现组播,可以部署在一个局域网 ...

  5. 基于python3的群聊聊天室

    码云地址 基于websocket 开源聊天室 chatroom: 非常简单的聊天 具有高匿名聊天作用本项目使用 python3 + html5 + websocket + gzip github地址: ...

  6. 实验三 实现私聊群聊聊天室

    一.实验目的 1.掌握各个内置对象的含义: 2.理解并熟练应用session.application对象. 二.实验内容 1.设计聊天室,在聊天室中,需要通过JSP内置对象application来实时 ...

  7. 基于UDP的网络群聊聊天室

    目录 聊天室的功能: 链表节点结构体 自定义应用层协议结构体,用来传输数据 服务器程序及客户端程序所使用的函数 系统提供的部分函数 1.socket 2.bind 3.listen 4.fork 5. ...

  8. 基于netty的可群聊聊天室

    一.环境配置 <dependencies><dependency><groupId>io.netty</groupId><artifactId&g ...

  9. python群聊聊天室程序_Python聊天室程序(基础版)

    本文实例为大家分享了Python聊天室程序的具体代码,供大家参考,具体内容如下 客户端代码: # Filename: socketClient.py import socket import sys ...

最新文章

  1. 深入浅出依赖注入框架Dagger2
  2. 一些VR延迟优化方法
  3. 支付宝回应“崩了”:机房网络出现短暂抖动,已恢复正常
  4. 设置linux英文环境,英文Linux里中文和日文用户环境设置
  5. java 千位分隔,如何在Java中设置千位分隔符?
  6. Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法
  7. 【C/C++】一道试题,深入理解数组和指针
  8. 最速下降法极小化rosenbrock函数 代码_典型算法思想与应用9|分支限界法与电路布线问题
  9. 深度报告 | 4G应用启示录与5G应用展望
  10. 表单_内置Filed
  11. 投简历的格式(第一分简历)
  12. 7-34 查询水果价格 (15 分)
  13. eclipse打开报错:Failed to load the JNI shared library
  14. android_10.0.0_r41自定义驱动编译+Framework层调用_2(自定义驱动)
  15. Rocksdb prefix Bloomfilter
  16. python趣味编程入门与实战技巧_Python趣味编程入门与实战
  17. mysql忘记密码找回root密码
  18. MySQL 的read_only 只读属性说明
  19. Windows Server 活动目录功能
  20. fluent怎么用c语言编程,[转载]FLUENT UDF 使用指导

热门文章

  1. 数学知识——欧拉函数
  2. godaddy plesk mysql_» Godaddy的Plesk面板语言更改图文详细教程
  3. 数据库关系代数练习题
  4. Lantek.v27-ISO 1DVD(钣金专家)
  5. 数据库关键字(保留字)
  6. mysql 拼音查询_mysql中文字段转拼音首字母,以及中文拼音模糊查询
  7. 数字金融VS传统金融,区块链如何革新信任机制?
  8. oracle 10g与oracle 11g的不同
  9. win10下如何使用的debug
  10. Thunk,thunk,thunk