第三十四天 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地址 有多 ...
随机推荐
- Netty入门(二)之PC聊天室
参看Netty入门(一):Netty入门(一)之webSocket聊天室 Netty4.X下载地址:http://netty.io/downloads.html 一:服务端 1.SimpleChatS ...
- Python中for循环搭配else的陷阱
假设有如下代码: for i in range(10): if i == 5: print 'found it! i = %s' % i else: print 'not found it ...' ...
- 一文看懂Transformer内部原理(含PyTorch实现)
Transformer注解及PyTorch实现 原文:http://nlp.seas.harvard.edu/2018/04/03/attention.html 作者:Alexander Rush 转 ...
- Windows10上使用Linux子系统(WSL)
Linux的Windows子系统让开发人员可以直接在Windows上运行Linux环境(包括大多数命令行工具,实用程序和应用程序),而无需建立在虚拟机的开销之上,整个系统共200多M,但包含了你能用到 ...
- vue better-scroll用法
滚动位置固定:在vue中通过路由切换页面时组件会自动滚动到顶部,需要监听滚动行为才能让滚动位置固定,better-scroll解决了这个问题. 常用效果:移动端很常见的效果,当滑动右边部分的时候,左边 ...
- JSF生存指南P1
这是OO的第三次博客作业,也是JSFO(面向JSF编程)的第一次博客作业.暗示了我们面向对象课程已经再向JSF的编写过渡. 不知不觉OO的作业已经写完3/4,那些熬夜赶作业的日子仍然历历在目,仿佛是昨 ...
- Python—json模块
用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...
- lower_bound函数与upper_bound函数
头文件 : algorithm vector<int>a a中的元素必须升序,用的是二分 lower_bound(a.begin(),a.end(),k) 返回a容器中,最右边的小于等于k ...
- WCF上传下载文件
思路:上传时将要上传的文件流提交给服务器端 下载时只需要将服务器上的流返回给客户端即可 1.契约,当需要传递的数量多于一个时就需要通过messagecontract来封装起来 这里分别实现了上传和下载 ...
- 使用withCount后再使用select设置查询的字段。就找不到withCount的数据了
https://laravelacademy.org/index.php/discussion/1021 如:Article::withCount(['comments'])->select(' ...