第三十四天 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地址 有多 ...
随机推荐
- 单点登录SSO:图示和讲解
目录 概述 示例运行效果动画 跨域Web SSO时序图 代码截图 几个基本概念 涉及的站点和页面 重点理解:单点登录的核心步骤 敢说最准确的单点登录图示,因为: 我严格对照所画时序图的每个步骤,开发了 ...
- .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中
不知你是否见过 try { } finally { } 代码中,try 块留空,而只往 finally 中写代码的情况呢?这种写法有其特殊的目的. 本文就来说说这种不一样的写法. 你可以点开这个链接查 ...
- 教你使用HTML5原生对话框元素,轻松创建模态框组件
HTML 5.2草案加入了新的dialog元素.但是是一种实验技术. 以前,如果我们想要构建任何形式的模式对话框或对话框,我们需要有一个背景,一个关闭按钮,将事件绑定在对话框中的方式安排我们的标记,找 ...
- 52abp框架asp.net core & Angular快速开发实战视频教程
课程标题 52abp框架asp.net core & Angular全栈开发实战视频课程 课程简介 从零开始学 52ABP企业开发框架,企业项目是如何开发和技术选型,代码如何管理,团队协同开发 ...
- R语言线性回归
回归分析是一个广泛使用的统计工具,用于建立两个变量之间的关系模型. 这些变量之一称为预测变量,其值通过实验收集. 另一个变量称为响应变量,其值来自预测变量. 在线性回归中,这两个变量通过一个等式相关联 ...
- bug总结
1.被除数为0 2.Java 空指针异常(java.lang.NullPointerException) 即对象没有进行实例化便进行了使用.实例化的意义,就是将对象实例的地址赋值给对象符号. 比如 S ...
- 书城项目第五阶段---book表的curd
JavaEE三层架构分析 MVC
- mysql常用命令行操作(二):表和库的操作、引擎、聚合函数
一.查看.创建.删除数据库 create database library default character set utf8 collate utf8_general_ci; # 创建数据库并设置 ...
- Latex常用软件
Linux texMaker sudo apt-get install texlive-full sudo apt-get install texmaker
- Numpy中array数据操作
1.创建: import numpy as np arr=np.array([1,2,3]) print(arr,arr.ndim) list=[1,2,3] arr=np.array(list) 2 ...