热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:udp协议与进程结合(群聊)

本文由编程笔记#小编为大家整理,主要介绍了udp协议与进程结合(群聊)相关的知识,希望对你有一定的参考价值。服务端:
本文由编程笔记#小编为大家整理,主要介绍了udp协议与进程结合(群聊)相关的知识,希望对你有一定的参考价值。

服务端:

"""
/etc/python3
@File : chat_server.py
@Time : 2020/7/13 下午5:15
@Author : wangyongqi
@Email : 92644827@qq.com
@SOftware : PyCharm
"""
from socket import *
from multiprocessing import Process
# 服务器使用地址
HOST = "0.0.0.0"
PORT
= 8848
ADDR
= (HOST,PORT)
# 存储用户 {name:address ...}
user = {}
# 处理进入聊天室
def do_login(sock,name,address):
if name in user or 管理 in name:
sock.sendto(b
"FAIL",address)
return
else:
sock.sendto(b
"OK", address)
# 通知其他人
msg = "欢迎 %s 进入聊天室"%name
for i in user:
sock.sendto(msg.encode(),user[i])
# 存储用户
user[name] = address
# print(user)
def get(sock,name,top):
tmp
=%s:%s%(name,top)
print(tmp)
for i in user:
if i!=name:
sock.sendto(tmp.encode(),user[i])
def delect_exit(sock,name):
del user[name]
for i in user:
sock.sendto(f
{name}退出了聊天.encode(), user[i])
#将处理事件放在子进程,因为父进程要接收和处理管理员消息
def handle(sock):
# 循环接收来自客户端请求
while True:
# 接收请求 (所有用户的所有请求)
data, addr = sock.recvfrom(1024)
tmp
= data.decode().split( , 2) # 对请求内容进行解析
# 根据请求调用不同该函数处理
if tmp[0] == L:
# tmp ==> [L,name]
do_login(sock, tmp[1], addr) # 处理用户进入聊天具体事件
#如果标记为C 则是消息进行转发
elif tmp[0] == C:
get(sock, tmp[
1], tmp[2])
#如果表记是e就是退出的表记
elif tmp[0] == e:
delect_exit(sock, tmp[
1])
# 启动函数
def main():
sock
= socket(AF_INET,SOCK_DGRAM) # UDP套接字
sock.bind(ADDR)
#设置消息处理的子进程
p=Process(target=handle,args=(sock,))
#子进程随着父进程的结束而退出<避免出现孤儿进程的情况>
p.daemon=True
#启动子进程
p.start()
#循环接收管理员消息(父进程的消息<输入的消息>)
while True:
conment
=input("管理员:")
#如果管理员输入exit也就是退出直接跳出循环结束父进程<子进程随之结束>
if cOnment==exit:
break
#若程序未跳出就将消息加标记 发给自己,然后处理转发给everyone
data=fc 管理员 {conment}
sock.sendto(data.encode(),ADDR)
if __name__ == __main__:
main()

客户端:

 

 

"""
/etc/python3
@File : chat client.py
@Time : 2020/7/13 下午5:15
@Author : wangyongqi
@Email : 92644827@qq.com
@SOftware : PyCharm
"""
from socket import *
from multiprocessing import *
# 服务端地址
ADDR = ("127.0.0.1",8848)
# 请求进入聊天室 OK FAIL
def login(sock):
while True:
name
= input("Name:")
#加请求登录的表记L和用户名
msg = "L " + name # 根据通信协议整理发送信息
print(name)
#向服务器进行发送请求,服务器根据表记进行相应的处理
sock.sendto(msg.encode(),ADDR) # 发送请求
#等待服务器返回是否同意登录的应答
result,addr = sock.recvfrom(128) # 等待回复
#服务器返回OK说明登陆成功可以进行后续处理
if result.decode() == OK:
#主动给出提示
print("您已进入聊天室")
#返回用户名待用
return name
else:
print("你的名字太受欢迎了,换一个吧")
#向服务器发送消息
def put(sock,name):
while True:
msg
=input(说:)
#判定消息如果退出结束父进程
if msg==exit:
data
= "e %s"%(name)
sock.sendto(data.encode(), ADDR)
# 发送内容
break
#输入普通消息则加标记发送给服务器进行转发
else:
data
= "C %s %s"%(name,msg) #C为普通消息
sock.sendto(data.encode(),ADDR) # 发送内容
def get(sock):
while True:
#阻塞等待服务器转发的消息
data,addr = sock.recvfrom(1024) # 等待回复
#打印消息
print(data.decode())
def main():
#创建用户套接字
sock = socket(AF_INET,SOCK_DGRAM)
#进入聊天室
name=login(sock)
#创建接收消息的子进程
server_process = Process(target=get,args=(sock,))
#父进程结束则结束子进程
server_process.daemon=True
#启动子进程
server_process.start()
#父进程发送消息
put(sock, name)
if __name__ == __main__:
main()

 


推荐阅读
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • 从批量eml文件中提取附件的Python代码实现方法
    本文介绍了使用Python代码从批量eml文件中提取附件的实现方法,包括获取eml附件信息、递归文件夹下所有文件、创建目的文件夹等步骤。通过该方法可以方便地提取eml文件中的附件,并保存到指定的文件夹中。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
  • 一:跨域问题1、同源策略(浏览器的安全策略)    只允许当前页面朝当前域下发请求,如果向其他域发请求,请求可以正常发送,数据也可以拿回,但是被浏览器拦截了  2、c ... [详细]
  • php设置数组大小_【大厂必备】2020超经典PHP面试题
    结合我自己这段时间的面试情况,面对的一些php面试题列举出来,基本上结合自己的看法回答的,不妥的地方请大家指出去,与大家一起 ... [详细]
author-avatar
babe
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有