博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day33
阅读量:5304 次
发布时间:2019-06-14

本文共 4208 字,大约阅读时间需要 14 分钟。

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

转载于:https://www.cnblogs.com/yclzp/p/10952098.html

你可能感兴趣的文章
java复制文件
查看>>
第一册:lesson seventy nine.
查看>>
GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
查看>>
团队作业
查看>>
数据持久化时的小bug
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>
Vue 模板解释
查看>>
http://www.bootcss.com/
查看>>
20145308 《网络对抗》 注入shellcode+Return-to-libc攻击 学习总结
查看>>
将多张图片和文字合成一张图片
查看>>
自己动手写ORM(01):解析表达式树生成Sql碎片
查看>>
如何使用USBWebserver在本机快速建立网站测试环境
查看>>
百度Ueditor编辑器的Html模式自动替换样式的解决方法
查看>>
变量提升
查看>>
线性表可用顺序表或链表存储的优缺点
查看>>
在现有的mysql主从基础上,搭建mycat实现数据的读写分离
查看>>
[Flex] flex手机项目如何限制横竖屏?只允许横屏?
查看>>