聊天室项目

功能介绍:
1.进入聊天室:输入姓名,用户名(不能重复)
2.某个成员进入聊天室后给其他所有所有成员发送消息
3.任何一个人发消息,其他人都会收到
4.某人退出聊天室,其他成员也会收到通知
5.管理员可以从后台发送消息,此时所有成员都可以接收

技术分析:
1.发消息(UDP 套接字)
2.成员的存储(服务器端:{} [])
3.消息发送模式
转发:消息发送给服务器,再转发给其他成员
4.管理员
保证收发消息互不影响(每个人收发消息都随机),发消息和收消息分别使用一个进程

整体设计:
1.封装方式(函数)
2.编写流程:先确保通信实现,然后逐个功能实现
3.测试:实现一个功能,测试一个功能

聊天室项目实现
1.网络通讯实现

1.服务器(创建一个 UDP 套接字,绑定地址)多进程,1个进程接收消息,一个进程管理员喊话
2.客户端

2.进入聊天室实现

1.服务器1.接收姓名,判断是否已经存在1.存在:返回值为不允许进入2.不存在:1.将用户加入存储结构2.通知其他成员:XXX 进入聊天室2.客户端1.输入姓名2.把姓名包装,发送给服务端3.接收服务端的反馈结果1.不允许进入(用户名重复), 需要重新输入姓名2.允许进入,创建进程,一个进程发送消息,一个进程接收消息

3.退出聊天室

    1.客户端发送退出消息2.客户端父子进程退出3.服务器接收退出请求4.服务器通知其他成员5.服务器从列表中删除用户

第一个模块:QQserver.py (服务器搭建)


"""
名称:网络聊天室
环境:Python 3.5
技术:socket, fork
"""import socket
import os
import sys#创建网络连接
def main():#创建 UDP 套接字server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#设置端口复用server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)#绑定地址address = (('0.0.0.0',8888))server.bind(address)#创建多线程,让子进程负责管理员喊话,父进程和客户端交互pid = os.fork()if pid<0:#如果进程创建失败print('进程创建失败!')returnelif pid == 0:#子进程的任务while True:content=input('管理员说话:')message="speak 管理员:%s" % contentserver.sendto(message.encode(),address)else:#父进程处理客户端的各种请求doRequest(server)#处理客户端请求的函数
def doRequest(server):userlist={}#此字典用于存放客户端的名字和地址while True:#接收来自客户端的消息msg,addr = server.recvfrom(1024)msglist = msg.decode().split(' ')#拆分数据,以空格为分隔if msglist[0] == 'login':#如果是进入聊天室请求doLogin(server,userlist,msglist[1],addr)elif msglist[0] == 'speak':#msglist:['c','name','content']content = ' '.join(msglist[2:])#获取完整发送内容#发送给其他所有成员doChat(server,content,userlist,msglist[1])elif msglist[0] == 'quit':doQuit(server,msglist[1],userlist)#客户端退出处理函数
def doQuit(server,name,userlist):message = '\n%s 退出了聊天室' %namefor u in userlist:if u!=name:server.sendto(message.encode(),userlist[u])else:server.sendto('exit'.encode(),userlist[name])#从存储结构中删除del userlist[name]#用于聊天的函数(把内容发送给其他成员)
def doChat(server,content,userlist,name):message = '\n%s 说:%s' % (name,content)for u in userlist:if u!= name:#发给不是自身的所有客户端server.sendto(message.encode(),userlist[u])#列表用字典存储{name,addr}
#进入聊天室请求处理函数
def doLogin(server,userlist,name,addr):#判断姓名是否同名if (name in userlist) or name == '管理员':#如果列表中已经存在此用户名,或取名为管理员server.sendto('该用户已经存在!'.encode(),addr)return#函数结束,返回继续接收新的数据#同名不存在,发送信号给客户端,运行进入server.sendto('OK'.encode(),addr)#通知所有人message='\n欢迎%s进入聊天室'%namefor u in userlist:server.sendto(message.encode(),userlist[u])#全发userlist[name]=addr#加入到存储结构userlist字典中print(userlist)if __name__ == '__main__':main()

第二个模块:QQclient.py (客户端搭建)

import socket
import os
import sysdef main():#从命令行输入IP地址和端口号if len(sys.argv)<3:print('参数错误!')returnaddress = (sys.argv[1],int(sys.argv[2]))#创建 UDP 套接字client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#接收用户输入,包装后发送给服务器while True:name = input('请输入姓名:')message = 'login ' + name#此处加入标记client.sendto(message.encode(),address)data,addr = client.recvfrom(1024)if data.decode() == 'OK':print('您已经进入聊天室...')breakelse:#不允许进入#打印不允许进入的原因print(data.decode())#创建进程pid = os.fork()if pid<0:sys.exit('创建进程失败!')elif pid == 0:sendmsg(client,name,address)else:recvmsg(client)def sendmsg(client,name,address):#发送消息给服务器,服务器群发给所有客户端while True:content=input('请发言(输入quit 退出):')if content == 'quit':message =  'quit ' + nameclient.sendto(message.encode(),address)sys.exit('已退出聊天室')#子进程退出#包装消息message = 'speak %s %s' % (name,content)client.sendto(message.encode(),address)def recvmsg(client):while True:message,addr = client.recvfrom(1024)if message.decode() == 'exit':#如果收到服务器此消息,父进程退出os._exit(0)#因为print覆盖了之前的input界面,在这里重新输出一遍print(message.decode()+'\n请发言(quit退出):',end='')if __name__ == "__main__":main()

本人原创,欢迎转载~

基于 python 和 UDP 协议实现简易聊天室(多人群聊)----详细解析带字幕相关推荐

  1. Go实现简易聊天室(群聊)

    参考:Go 群聊 ( goroutine ) · 语雀 基于websocket的聊天室,可进一步参考: (1) go实现聊天室(WebSocket方式) (2) Golang代码搜集-基于websoc ...

  2. 小成开发日记---利用Qt/C++实现基于Udp协议的网络聊天室(分服务端和客户端的开发【轻聊v1.0.1】)

    作者:小成Charles 原创作品 转载请标注原创文章地址:https://blog.csdn.net/weixin_42999453/article/details/112363393 一.引言 最 ...

  3. (已完善)基于Python的TCP 协议实现人机聊天(程序具有服务端和客户端)

    服务端 实现目标 GUI显示人机互动聊天内容,当客户端输入不完整内容,如'how old',服务器能回复年龄等. GUI当客户端输入"send a file",服务器端回复&quo ...

  4. 《深度学习入门:基于Python的理论与实现》第四章代码原理详细解析

    这一章的代码解读的难点是: 涉及到两个函数的求导问题. ①sigmoid函数的求导: ∂yj∂xj=yj(1−yj)\frac{\partial y_j}{\partial x_j}=y_j(1-y_ ...

  5. 《 Python程序设计项目案例》— 用Python开发的基于TCP通讯协议的私人聊天室 (期末大作业、结课作业、课程设计、毕业设计)

    基于Python与TCP协议的私人聊天室(GUI交互界面,用户注册.用户登录.实时聊天,文件上传与下载) 用Python开发的基于TCP通讯协议的实时聊天通讯和文件共享应用 目录 基于Python与T ...

  6. 网络编程应用:基于UDP协议【实现聊天程序】--练习

    要求: 使用UDP协议实现一个聊天程序 代码: 发送端: package UDP聊天程序;import java.io.IOException; import java.net.DatagramPac ...

  7. 简易聊天室(Python版)

    目录 简介 运行效果 代码 客户端 服务器 自定义库 通讯协议及相关配置定义库(DY.py) 数据库调用库(SJK.py) 套接字库(TJZ.py) 套接字通讯库(服务器端)(TJZ_FZ.py) 简 ...

  8. 【Linux网络编程】基于UDP实现多人聊天室

    文章目录 一.UDP的概念 1.1 UDP 1.2 UDP特点 二. 采用UDP实现多人聊天室原因 三.多人聊天室项目功能 四.实现多人聊天室项目流程分析 4.1 前期准备 4.1.1 定义结构体 4 ...

  9. 基于C#的UDP协议的同步实现

    一.摘要 总结基于C#的UDP协议的同步通信. 二.实验平台 Visual Studio 2010 三.实验原理 UDP传输协议同TCP传输协议的区别可查阅相关文档,此处不再赘述. 四.实例  4.1 ...

最新文章

  1. linux中断共享程序实现,如何在非实时linux上实现实时应用程序与内核模块之间共享存储器...
  2. phpstorm 点击方法跳转 后 返回 原来的位置
  3. Mysql---Centos7软件安装
  4. 在线白板,基于socket.io的多人在线协作工具
  5. 在ubuntu上使用SSH客户端
  6. Spring Initializr创建项目,利用阿里云URL解决Initialization failed for https://start.spring.io Please check URL
  7. How Many Answers Are Wrong HDU - 3038(带权并查集)
  8. Word2Vec学习笔记(四)——Negative Sampling 模型
  9. 一个三十岁男人的婚姻思考
  10. 通过增强的 Windows Forms 支持为 .NET 应用程序精心制作华丽的 UI
  11. PHP两个二维数组数据处理:字段值相等,则赋值给另一个数组
  12. 使用计算机对炼钢过程,炼钢过程计算机二级系统
  13. html原生的日期选择器,原生JS实现日期选择
  14. android外接键盘打汉字,外接键盘情况下,安卓打字不如windows
  15. 均值、均方值、方差、均方差和协方差概念及其物理意义
  16. 每日一课 | python烤地瓜案例
  17. Keil5新建工程小白指南
  18. 随手查_python
  19. Minecraft 1.12.2模组开发(十) 食物制作
  20. 苹果的黑科技:如何让按不动的触控板产生点按的感觉

热门文章

  1. js对象常用方法总结
  2. 电脑怎么录屏幕视频带声音?电脑录屏教程介绍
  3. 从键盘输入一个三位整数n,分别求出n的个位数字、十位数字和百位数字
  4. 将Excel表格转换为MarkDown表格
  5. html中css如何设置显示国旗,CSS3 各国国旗
  6. CDA Level Ⅲ 模拟题(二)
  7. python中一般使用几个空格表示缩进_为什么Python pep-8强烈建议使用标签上的空格来缩进?...
  8. CAD打碎块(网页版)
  9. Iris Network Traffic Analyzer简易教程
  10. PA 调试心得(一个电容引发的问题)