UDP 协议
什么是UDP协议 用户数据包协议 OSI模型中 属于传输层的协议, 仅用于不要求可靠性,不要求分组顺序且数据量较小(1472)的简单传输,力求快,如何使用
通讯流程类似对讲机 只管发送不管对方是否接受到 甚至不关心对方在不在 1.买对讲机 创建UDP和socket 2.固定频道 bind一个IP和端口 3.收发数据 recvfrom 和sendto1.买个对讲机
2.指定发送的频道 3.收发数据
与TCP的区别 *****
不可靠传输 不需要建立连接 不会粘包 单次数据包不能太大
UDP与TCP的具体传输过程分析对比
TCP在传输过程中需要保证数据的完整性,所以当数据从操作系统缓存发出时,并不会立即删除缓存数据,而是等待对方返回确认信息后才会删除,
而UDP发送后立即清空数据,所以数据发送是一次性的,无论成功还是失败,所以会造成数据丢失,当然TCP也会丢失但是会有自动重传机制。
代码 :
服务器端 服务器不需要监听 listen 不需要接收请求 accept 收数据 recvfrom(缓冲区大小) 发数据 sendto(数据,地址)客户端:
不需要建立连接 收数据 recvfrom(缓冲区大小) 发数据 sendto(数据,地址)##################################################
udp的使用
服务器代码
from socket import *# 创建基于UDP的scoket 必须手动指定
server = socket(AF_INET,SOCK_DGRAM)server.bind(("127.0.0.1",1688))
while True:
data,addr = server.recvfrom(1024) print("收到来自%s的消息 : %s" % (addr,data)) server.sendto(data.upper(),addr)# server.close()
客户端
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# UDP 不需要建立链接# 发送数据时 要指定接受方地址
client.sendto("hello".encode("utf-8"),("127.0.0.1",1688))data,addr = client.recvfrom(1024)
print("收到来自%s的消息 : %s" % (addr,data)) client.close()###########################################################
udp不粘包
服务器
from socket import *# 创建基于UDP的scoket 必须手动指定
server = socket(AF_INET,SOCK_DGRAM)server.bind(("127.0.0.1",1688))
# 在接受的时候 缓冲区大小必须大于数据的长度data,addr = server.recvfrom(1)print(data)
# server.close()
客户端
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)# UDP 不需要建立链接# 发送数据时 要指定接受方地址
client.sendto("hello".encode("utf-8"),("127.0.0.1",1688))# client.sendto("world".encode("utf-8"),("127.0.0.1",1688))
client.close()
#######################################################################
udp发不了大数据
#############################################
练习
服务器
from socket import *
import timeserver = socket(AF_INET,SOCK_DGRAM)
server.bind(("127.0.0.1",1688))while True:
data,addr = server.recvfrom(1472) res = time.strftime(data.decode("utf-8"),time.localtime()) server.sendto(res.encode("utf-8"),addr)
客户端
from socket import *
client = socket(AF_INET,SOCK_DGRAM)
client.sendto("%Y-%m-%d".encode("utf-8"),("127.0.0.1",1688))data,addr = client.recvfrom(1472)print(data)
#########################################################
多个客户端同时处理
服务器
from socket import *
import timeserver = socket(AF_INET,SOCK_DGRAM)
server.bind(("192.168.13.93",1688))# UDP 可以处理多个客户端 但是并不是真正的同时处理 而是按顺序处理 速度非常快 感觉像是同时处理 叫并发
# 并行 真正同时处理 想要真正的同时运行 必须由多个执行单位 # 模拟一下聊天室# 客户端发消息来 服务器就把客户端地址存起来# 再有消息来 服务器循环给每一个人都发一份# 客户端列表
clients = {} while True: try: data,addr = server.recvfrom(1472) if addr[0] not in clients: clients[addr[0]] = addr try: print("%s说:%s" % (addr[0],data.decode("utf-8"))) except: print("编码有问题啊 .....") # 遍历所有客户端 转发消息给他们 for k,v in clients.items(): server.sendto(data,v) except Exception as e: # print(e) pass# 如果要限制发消息不能太频繁 思路如下:
# 收到数据后 把你的地址 和发送数据的时间记录下来 # 遍历出所有数据 1888888888 188888888.1 10 # 以当前时间为起始 100 取出消息的时间 如果时间范围为98-100客户端
from socket import *
client = socket(AF_INET,SOCK_DGRAM)
while True: # msg = input("msg:").strip() client.sendto("client2".encode("utf-8"),("127.0.0.1",1688)) data,addr = client.recvfrom(1472) print(data)####################################################
DNS服务器
DNS服务器了解
DNS Domain Name System 全称 :域名解析服务器 DNS 是干什么的 : 将域名转换为IP地址 要连接服务器 一定的知道IP \ 为什么需要DNS 单独ip不方便记忆 所以我们吧ip和一个域名绑定到一起 域名一串有规律的字符串 www.baidu.comDNS 是CS结构的server端
DNS 使用的是UDP 协议 因为 传输的数据小 但对速度要求高 一个DNS要服务很多计算机http:// news.cctv.com /2019/05/29/ARTIXRqlqFBp59eECweiXTUU190529.shtml
协议名称 域名 文件路径DNS 本质就是一个数据库 里面就存储 域名和ip的对应关系
news.cctv.com .com 顶级域名 cctv 二级域名 news 三级域名#####################################################
多进程
进程是什么?
正在运行的程序进程来自于操作系统 没有操作系统就没有进程操作系统是什么?
也是一套软件 , 主要功能
1.控制硬件,隐藏丑陋复杂的硬件细节 2.将无序的硬件竞争变得有序早些年 计算机同一时间只能运行一个程序,这时候是不可能并发的
要并发 当然需要不同的应用程序 ,如何使多个应用程序同时被运行这就需要多道技术来支持##########################################################
多进程的实现原理-多道技术
多道技术
多道技术:为了提高计算机的利用率
1.空间复用 把内存分割为不同区域 ,每个区域装入不同的程序 2.时间复用 当一个程序执行IO操作时,切换到另一个程序来执行-----执行时间过长也会被停止操作. 光切换还不行 必须在切换前保存当前的状态 以便与恢复执行当内存中有多个程序时,必须保证数据是安全的
每个进程之间的内存区域是相互隔离的,而且是物理层面的隔离有了多道技术
计算机就可以在同一时间处理多个任务(看着像 由于计算远比人块 所以感觉同时执行了)注意:并不是多道就一定提高了效率
如果多个任务都是纯计算 那么切换反而降低了效率 遇到IO操作才应该切换 这才能提高效率