• Python Day 31 UDP协议 DNS服务器 进程 多道技术


      ##内容回顾

    1.  半连接数
        指的是没有完成的链接
        1.1 客户端恶意攻击,只进行两次握手 导致服务器处于等待状态
        1.2 有大量的客户端同时访问  (高并发) 服务器处理不过来
        listen() 函数中可以指定最大的半连接数量  超出这个数量将会被拒绝
        处于半连接状态的链接  会在超时后被丢弃
    2.  粘包问题 网络编程重点
        粘包问题只出现在TCP协议中,因为TCP是流式协议,数据之间没有明显分隔
        之所以出现粘包
        1. 把时间间隔短的 数据量小的数据 一次性发送
        2. 数据已经到达 接收多了或少了 都会粘包
        之所以粘包本质原因就是接收方不清楚数据长度
        解决方案就是提前告诉接收方数据长度
    
        发送方
        1.发送数据长度
            长度信息也会粘包  所以 一定要确保每一次发送的数据信息的长度 所占的字节是固定的
            例如  8  或 4
            struct  模块就可以把一个python的数据类型 转为二进制 并且字节数固定
            q 转为8字节    i   转为4字节
    
        2.发送真实数据
    
        接收方
        1.先接受长度
        2.再接收真实数据
    
    3. 自定义报头
        不仅要传输数据过去  可能还要额外传输一些信息  例如文件名称  大小 md5等等........
        报头就是传输数据前 先传输的一个信息   通常用json
        本质就是  多传输了一个json数据
        发送
        1.先发json数据的长度
        2.在发送json(报头)数据
        3.在发送真实数  也会粘包 所以要把长度放入报头中
    
                        json也可以传输二进制   但是json本质是字符串 所以必须把二进制转为字符串  接收方吧字符串转二进制
                        BASE64 编码
        接收:
        1.先收报头长度
        2.收报头
        3.真实数据

      ##UDP协议

     #什么是UDP协议
        用户数据包协议
        OSI模型中 属于传输层的协议, 仅用于不要求可靠性,不要求分组顺序且数据量较小的简单传输,力求快
    
    #如何使用
        通讯流程类似对讲机    只管发送不管对方是否接受到 甚至不关心对方在不在
        1.买对讲机
        2.固定频道
        3.收发数据
    
        1.买个对讲机
        2.指定发送的频道
        3.收发数据
    与TCP的区别    *****
        不可靠传输
        不需要建立连接
        不会粘包
        单次数据包不能太大
    
    
    代码 :
        服务器端
        服务器不需要监听 listen
        不需要接收请求 accept
        收数据  recvfrom(缓冲区大小)
        发数据  sendto(数据,地址)
    
    
    客户端:
        不需要建立连接
        收数据  recvfrom(缓冲区大小)
        发数据  sendto(数据,地址)
    #示例1
    —————————————服务器.py——————————————————————
    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()
    —————————————客户端.py——————————————————————
    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()
    
    
    #示例2:在接受的时候 缓冲区大小必须大于数据的长度
    —————————————服务器.py——————————————————————
    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)
    —————————————客户端.py——————————————————————
    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()
    
    #示例3:UDP发不了大数据
    —————————————服务器.py——————————————————————
    from socket import  *
    
    server = socket(AF_INET,SOCK_DGRAM)
    
    server.bind(("127.0.0.1",1688))
    
    while True:
        data,addr = server.recvfrom(1024*1024)
        print(data)
    
    —————————————客户端.py——————————————————————
    """UDP单次数据包不能太大"""
    
    from socket import  *
    
    client = socket(AF_INET,SOCK_DGRAM)
    
    data = b""
    for i in range(1024 * 60):
        data += b"1"
    
    client.sendto(data,("127.0.0.1",1688))
    
    #示例4:多个客户端同时处理
    —————————————服务器.py——————————————————————
    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
    
    —————————————客户端.py——————————————————————
    “”“
    多个客户端问题:可以在一个客户端.py模块执行多个窗口来测试
    pycharm默认只能开一个问题:界面code下面,有个start标记----选择里面的Edit Configurations---------然后在弹出的窗口右上方打勾
    ---就可以执行多个客户端 ”“” 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 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操作才应该切换    这才能提高效率
  • 相关阅读:
    vi编辑器命令大全
    Ubuntu环境搭建svn服务器
    Visual Studio中“后期生成事件命令行” 中使用XCopy命令
    解决 Visual Studio For Mac 还原包失败问题
    [Win10应用开发] 如何使用Windows通知
    [Win10应用开发] 使用 Windows 推送服务
    如何使用 PsExec 执行远程命令
    如何在调试Window App时,触发 Suspending ,Resuming 等事件
    如何 “解决” WPF中空域问题(Airspace issuse)
    浅谈可扩展性框架:MEF
  • 原文地址:https://www.cnblogs.com/liangzhenghong/p/10952485.html
Copyright © 2020-2023  润新知