zoukankan      html  css  js  c++  java
  • 面向对象编程(UDP协议)

    UDP协议

    UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

    服务端

    '''
    UDP 协议 又称 数据报协议 SOCK_DGRAM
    
    '''
    from socket import *  # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket.
    
    server = socket(AF_INET,SOCK_DGRAM)
    server.bind(('127.0.0.1',8080))  # IP和端口 要绑定 服务端固定的IP端口
    # server.listen() # 不需要 挂起的链接数 udp 没连接
    
    # server.accept()  # 不需要 因为udp就没连接
    # while True:
    #     conn,addr = server.accept()  # 干连接循环的活
    
    while True:
        data,client_addr = server.recvfrom(1024)
        print('客户端数据:',data)  # 我要知道谁给我发的
        '''
        (b'data', ('127.0.0.1', 51182))
        (b'hello', ('127.0.0.1', 51182))
        '''
        server.sendto(data.upper(),client_addr)
    
    server.close()

    客户端

    '''
    udp 可以发空 数据报协议 说是发空,其实不是空 ,还有一个IP 端口的信息,发空时 带个端口信息
    tcp:不是一一对应的
    udp:是一一对应的 数据报 完整的
    '''
    from socket import *  # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket.
    
    client = socket(AF_INET,SOCK_DGRAM)
    # server.bind('127.0.0.1',8080)  # IP和端口 要绑定 服务端固定的IP端口
    # server.listen() # 不需要 挂起的链接数 udp 没连接
    
    # server.accept()  # 不需要 因为udp就没连接
    # while True:
    #     conn,addr = server.accept()  # 干连接循环的活
    
    while True:
        msg = input('>>>:').strip()  # udp 可以发空 收到一个空
        # if not msg:continue
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))  # 明确的指定发给谁 因为没有连接了
    
        data,server_addr = client.recvfrom(1024)
        print('服务端返回的数据:',data,'服务端的地址:',server_addr)
    server.close()

    不会粘包的UDP

    服务端

    # -*- coding:utf-8 -*-
    '''
    UDP 协议 又称 数据报协议 SOCK_DGRAM
    sendto recvfrom 一一对应 数据报协议 没有粘包问题 udp 数据不安全 有可能发送数据 > 1024 或者网络异常 数据没了
    tcp: 数据一定要可靠
        远程执行命令
        下载文件
    udp协议:
        QQ
        查询操作eg:互联网上 查询时间  ntp时间服务器 udp协议 eg:查域名 转成ip 端口 dns服务器走的就是udp协议  能保证查询效率高 数据虽然不可靠
        ntp时间服务器 dns服务器 qq 都是udp
    '''
    # from socket import *  # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket.
    #
    # server = socket(AF_INET,SOCK_DGRAM)
    # server.bind(('127.0.0.1',8080))  # IP和端口 要绑定 服务端固定的IP端口
    #
    # res1 = server.recvfrom(1024)
    # print('第一次:',res1)
    # res2 = server.recvfrom(1024)
    # print('第二次:',res2)
    
    from socket import *  # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket.
    
    server = socket(AF_INET,SOCK_DGRAM)
    server.bind(('127.0.0.1',8080))  # IP和端口 要绑定 服务端固定的IP端口
    
    res1 = server.recvfrom(4)
    print('第一次:',res1)
    res2 = server.recvfrom(1024)
    print('第二次:',res2)

    客户端:

    '''
    udp 可以发空 数据报协议 说是发空,其实不是空 ,还有一个IP 端口的信息,发空时 带个端口信息
    tcp:不是一一对应的
    udp:是一一对应的 数据报 完整的额 
    '''
    # from socket import *  # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket.
    #
    # client = socket(AF_INET,SOCK_DGRAM)
    #
    # client.sendto(b'hello',('127.0.0.1',8080))
    # client.sendto(b'world',('127.0.0.1',8080))
    # client.close()
    
    from socket import *  # 一般不这样做 会重名 但写socket可以这样写 因为要用到太多 会有大量的socket.
    
    client = socket(AF_INET,SOCK_DGRAM)
    
    client.sendto(b'hello',('127.0.0.1',8080))
    client.sendto(b'world',('127.0.0.1',8080))
    client.close()

    TCP VS UDP

    tcp基于链接通信

    • 基于链接,则需要listen(backlog),指定连接池的大小
    • 基于链接,必须先运行的服务端,然后客户端发起链接请求
    • 对于mac系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端在收消息后加上if判断,空消息就break掉通信循环)
    • 对于windows/linux系统:如果一端断开了链接,那另外一端的链接也跟着完蛋recv将不会阻塞,收到的是空(解决方法是:服务端通信循环内加异常处理,捕捉到异常后就break掉通讯循环)
    • 流式协议  会粘包  不可以发空 send recv 不是 一 一对应
    • tcp适用于:
      • 数据一定要可靠
      • 远程执行命令
      • 下载文件

    udp无链接

    • 无链接,因而无需listen(backlog),更加没有什么连接池之说了
    • 无链接,udp的sendto不用管是否有一个正在运行的服务端,可以己端一个劲的发消息,只不过数据丢失
    • recvfrom收的数据小于sendto发送的数据时,在mac和linux系统上数据直接丢失,在windows系统上发送的比接收的大直接报错
    • 只有sendto发送数据没有recvfrom收数据,数据丢失
    • 数据报协议  不会粘包 可以发空 sendto recvfrom 一 一 对应  数据报协议  数据不安全 有可能发送数据 > 1024 或者网络网络异常 数据没了
    • udp适用于
      • QQ
      • 查询操作  eg: ntp时间服务器  dns服务器(查域名,转ip)  能保证查询效率高,数据虽然不可靠 

    -------------------------------------------------------------

    考核:

    socket 通信 server client
    定义一个学生类
    元类? 使用元类定义一个对象
    粘包
    3次握手

    封装 继承 多态
  • 相关阅读:
    若干代码坏味及解法
    编程漫谈(十八):编程三境界
    如何不虚度光阴
    打印预览内嵌浏览器的两种方法
    LODOP多个表格带表格页脚关联
    Akka学习笔记
    Spring和Springboot相关知识点整理
    python接口测试:在一个用例文件中调用另一个用例文件中定义的方法
    使用jmeter对字符串进行加密
    (八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)
  • 原文地址:https://www.cnblogs.com/mjiu/p/10022102.html
Copyright © 2011-2022 走看看