第三十四天 UDP协议 并发编程
一.TCP半连接池原理
半连接池的工作原理
目前我们的程序是单线程 服务器要么处理通讯要么处理连接请求 无法同时进行
#服务器 import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",9999))
# 不是罪大连接数
server.listen(5)
while True:
c,addr = server.accept
while True:
try:
msg = c.recv(1024).decode("utf-8")
if not msg:
c.close()
break
c.send(msg.upper().encode("utf-8"))
except BaseException:
print("客户端异常断开")
c.close()
server.close() #用户端 import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",9999))
while True:
data = input(">>>:")
if not data:coninue
client.send(data.encode("utf-8")
print(msg)
client.close()
二.TCP 和 UDP 发送数据是的流程
解释 为何TCP是可靠的 是因为发送数据后必须受到确认包
#服务器 import socket
#创建socket对象 指定type参数为socket.SOCK_DGRAM表示使用UDP协议
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#datagram数据报的意思
# 绑定ip和端口
server.bind(("127.0.0.1",8888))
while True:
# 接受数据 返回一个元祖 数据和 发送方的地址
msg,c_adde = server.recvfrom(1024)
print("收到来自%s: 说:%s"%(c_addr[0],msg.decode("utf-8")))
# 发送数据到指定ip和端口
server.sendto(msg.upper(),c_addr) #客户端
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input(">>>:")
client.sendto(msg.encode("utf-8"),("127.0.0.1",8888))
print(data.decode("utf-8")
三.UDP聊天
与TCP代码的区别
不需要监听 不需要接收
type参数为 SOCK_DGRAM
UDP 可以同时处理多个客户端 是因为CPU处理速度快 给人感觉像同时处理
群聊
1.客户端先把数据交给服务器
2.服务器先存储对方的地址
3.把收到的数据给所有人都发一遍
#服务器 import socket
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(("127.0.0.1",8848)) #如果客户端与服务器同一台计算机 并且有多个客户端 这些客户端ip都是相同127.0.0.1
clients = {}
while True:
msg,addr = server.recvfrom(1024)
# 存储对方的地址:
clients[addr[1]] = addr
print(msg.decode("utf-8"))
#循环发给所有人
for c in clients:
server.sendto(msg,clients[c]) #客户端1
import socket
c = coket.c=soket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg= input(">>>:")
c.sendto(msg.encode("utf-8"),("127.0.0.1",8848))
msg,addr = c.recvfrom(1024)
print(msg.decode("utf-8"))
#客户端2
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input(">>>:"
c.sendto(msg.encode("utf-8"),("127.0.0.1",8848))
msg,addr = c.recvfrom(1024)
print(msg.decode("utf-8"))
UDP聊天2
#服务器
import socket
server = socket.socket(socket.AF_INET,sccket.SOCK_DGRAM)
server.bind(("127.0.0.1",8848))
clients={}
while True:
msg,addr = server.recvfrom(1024)
clients[addr[1]] = addr print(msg.decode("utf-8"))
for c in clients:
server.sendto(msg,clients[c]) #发送机
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = input(">>>:")
c.sendto(msg.encode("utf-8"),("127.0.0.1",8848) #接收机
import socket
c = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#先随便发一条消息给服务器 让服务指导自己的地址
c.sendto("register".encode("utf-8"),("127.0.0.1",8848))
while True:
msg,addr = c.recvfrom(1024)
print(msg.decode("utf-8"))
6.UDP会粘包么?
#服务器 import socket
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server.bind(("127.0.0.1",8888))
while True:
msg,c_addr = server.recvfrom(512) print("收到自己%: 说:%s"%(c_addr[0],msg.decode("utf-8")))
server.sendto(msg.upper(),c_addr) #客户端
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
client.sendto("".encode("utf-8"),("127.0.0.1"8888))
client.sendto("".encode("utf-8"),("127.0.0.1"8888))
client.sendto("".encode("utf-8"),("127.0.0.1"8888))
client.sendto("".encode("utf-8"),("127.0.0.1"8888))
结论:
1.UDP 不粘包
2.缓冲区大小要足够装数据包大小 建议不要超过512
UDP的使用场景: 视频电话 语音电话 直播
DNS 域名解析服务器
做一个时间服务器 使用UDP协议 客户端请求服务器获取当前时间
#服务端
import socket
import time
# 创建socket对象 指定type参数为socket.SOCK_DGRAM 表示使用UDP协议
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # datagram数据报的意思
# 绑定ip和端口
server.bind(("127.0.0.1",8889)) while True:
# 接收数据 返回一个元祖 数据和 发送方的地址
msg,c_addr = server.recvfrom(1024)
msg=time.strftime("%Y-%m-%d %X").encode("utf-8")
print("%s 收到来自%s: 说:%s" % (time.strftime("%Y-%m-%d %X"),c_addr[0] ,msg.decode("utf-8")))
print(type(msg))
# 发送数据到指定ip和端口
server.sendto(msg.upper(),c_addr) #用户端
import socket client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # datagram数据报的意思 while True:
msg = input(">>>:")
client.sendto(msg.encode("utf-8"),("127.0.0.1",8889))
data,addr = client.recvfrom(1024)
print(data.decode("utf-8"))
第三十四天 UDP协议 并发编程的更多相关文章
- JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫
JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...
- COJ966 WZJ的数据结构(负三十四)
WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u ...
- NeHe OpenGL教程 第三十四课:地形
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Java进阶(三十四)Integer与int的种种比较你知道多少?
Java进阶(三十四)Integer与int的种种比较你知道多少? 前言 如果面试官问Integer与int的区别:估计大多数人只会说到两点:Ingeter是int的包装类,注意是一个类:int的初值 ...
- Gradle 1.12用户指南翻译——第三十四章. JaCoCo 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- SQL注入之Sqli-labs系列第三十四关(基于宽字符逃逸POST注入)和三十五关
开始挑战第三十四关和第三十五关(Bypass add addslashes) 0x1查看源码 本关是post型的注入漏洞,同样的也是将post过来的内容进行了 ' \ 的处理. if(isset($_ ...
- spring boot 常见三十四问
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...
- “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
第三百三十四节,web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息 crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多 ...
随机推荐
- zookeeper-分布式锁的代码实现-【每日五分钟搞定大数据】
本文涉及到几个zookeeper简单的知识点,永久节点.有序节点.watch机制.比较基础,熟悉的就别看了跳过这篇吧 每个线程在/locks节点下创建一个临时有序节点test_lock_0000000 ...
- [C# ASP.NET]如何让IIS Express支持外部(局域网)连接
声明:本文为www.cnc6.cn原创,转载时请注明出处,谢谢! 一.搭建环境: 1.系统:Win10 1809 2.IDE:Visual Studio 2017 3.Framework: 4.6.1 ...
- Go+Python双剑合璧
目的 Python调用Go的方法,Python有很多功能强悍又使用简洁的库.而新生军Go的多核心利用率也是非常强悍的.当然这是明面上的优点.反正你有很多理由想要让Python能够调用Go的方法. 实验 ...
- rest_framework之视图及源码剖析
最初形态(工作中可能会使用) 引子 Django的CBV我们应该都有所了解及使用,大体概括一下就是通过定义类并在类中定义get post put delete等对应于请求方法的方法,当请求来的时候会自 ...
- H5 video标签的属性
35-video标签 video标签的属性 src: 用于告诉video标签需要播放的视频地址 autoplay: 用于告诉video标签是否需要自动播放视频 controls: 用于告诉video标 ...
- 295B - Greg and Graph (floyd逆序处理)
题意:给出任意两点之间的距离,然后逐个删除这些点和与点相连的边,问,在每次删除前的所有点对的最短距离之和 分析:首先想到的是floyd,但是如果从前往后处理,复杂度是(500)^4,超时,我们从后往前 ...
- SDN 实验室学生们
SDN实验室系列:https://edu.cnblogs.com/campus/fzu/SdnLab --研究生及本科生们的博客及GitHub链接.欢迎各位大佬招募. 研究生 2018级 姓名 博客地 ...
- 如何实现用将富文本编辑器内容保存为txt文件并展示
1.实现思路 创建一个xx.txt文件,存放于项目路径下 用文件流去读取文件内容并将读取的内容存放到页面的富文本编辑器框内 富文本编辑框内容改变后,保存时用文件流的方式保存到xx.txt文件中 提示: ...
- rbac权限+中间件
1.权限组件rbac 1.什么是权限 1 项目与应用 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how ---------->True or Flase 2.版本 ...
- Notepad++快捷使用
用Notepad++写代码,要是有一些重复的代码想copy一下有木有简单的方法呢,确实还是有的不过也不算太好用.主要是应用键盘上的 Home 键 和 End 键.鼠标光标停留在一行的某处,按 Home ...