热门标签 | 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()

 


推荐阅读
  • 本文详细介绍了如何在Oracle VM VirtualBox中实现主机与虚拟机之间的数据交换,包括安装Guest Additions增强功能,以及如何利用这些功能进行文件传输、屏幕调整等操作。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文详细介绍了在Linux操作系统上安装和部署MySQL数据库的过程,包括必要的环境准备、安装步骤、配置优化及安全设置等内容。 ... [详细]
  • http:blog.csdn.netzeo112140articledetails7675195使用TCPdump工具,抓TCP数据包。将数据包上传到PC,通过Wireshark查 ... [详细]
  • 利用 Python Socket 实现 ICMP 协议下的网络通信
    在计算机网络课程的2.1实验中,学生需要通过Python Socket编程实现一种基于ICMP协议的网络通信功能。与操作系统自带的Ping命令类似,该实验要求学生开发一个简化的、非标准的ICMP通信程序,以加深对ICMP协议及其在网络通信中的应用的理解。通过这一实验,学生将掌握如何使用Python Socket库来构建和解析ICMP数据包,并实现基本的网络探测功能。 ... [详细]
  • 本文详细介绍了Oracle 11g中的创建表空间的方法,以及如何设置客户端和服务端的基本配置,包括用户管理、环境变量配置等。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • 本文详细介绍了如何搭建一个高可用的MongoDB集群,包括环境准备、用户配置、目录创建、MongoDB安装、配置文件设置、集群组件部署等步骤。特别关注分片、读写分离及负载均衡的实现。 ... [详细]
  • 本文详细介绍了如何在ARM架构的目标设备上部署SSH服务端,包括必要的软件包下载、交叉编译过程以及最终的服务配置与测试。适合嵌入式开发人员和系统集成工程师参考。 ... [详细]
  • Django与Python及其他Web框架的对比
    本文详细介绍了Django与其他Python Web框架(如Flask和Tornado)的区别,并探讨了Django的基本使用方法及与其他语言(如PHP)的比较。 ... [详细]
  • Python学习day3网络基础之网络协议篇
    一、互联网协议连接两台计算机之间的Internet实际上就是一系列统一的标准,这些标准称之为互联网协议,互联网的本质就是一系列网络协议。二、为什么要有互联网协议互联网协议就相当于计 ... [详细]
  • Linux 防火墙与端口管理必备命令
    在使用 Linux 系统进行服务部署和问题排查时,防火墙和端口管理是不可或缺的操作。本文将详细介绍如何查看防火墙状态、端口占用情况,以及如何开放和关闭端口,帮助初学者更好地掌握这些技能。 ... [详细]
  • 本文详细介绍如何使用Netzob工具逆向未知通信协议,涵盖从基本安装到高级模糊测试的全过程。通过实例演示,帮助读者掌握Netzob的核心功能。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
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社区 版权所有