day33

UDP 协议
什么是UDP协议
用户数据包协议
OSI模型中 属于传输层的协议, 仅用于不要求可靠性,不要求分组顺序且数据量较小(1472)的简单传输,力求快,

如何使用
通讯流程类似对讲机 只管发送不管对方是否接受到 甚至不关心对方在不在
1.买对讲机    创建UDP和socket
2.固定频道     bind一个IP和端口
3.收发数据    recvfrom    和sendto

1.买个对讲机
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 time

server = 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 time

server = 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.com

DNS 是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操作才应该切换 这才能提高效率

posted @ 2019-05-30 21:16  轩辕12  阅读(156)  评论(0编辑  收藏  举报