zoukankan      html  css  js  c++  java
  • 基于udp协议的套接字及udp协议粘包问题

    udp协议的套接字

    udp协议传输  服务端和客户端没有建立连接一说。

    import socket
    # 总结一下基础工作流程:服务端生成套接字并绑定ip_port,进入数据传输循环,服务端接受客户端发送的信息和地址,
    # 然后服务端对客户端请求做出响应,发送处理好的数据根据而客户端地址。
    # 客户端建立套接字,直接进入传输循环,根据服务端的ip_port给服务端发送请求,接收数据返回处理的数据内容和服务端ip_port。
    # 客户端 sendto(字节 + 服务端ip_port) ——》服务端 recvfrom(1024)接收客户端数据和ip_port——》服务端处理数据,sendto(处理好的数据,客户端ip_port),
    # ——》客户端接受服务端数据和ip_port recvfrom(1024)
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报协议-》udp # 生成基于udp协议的套接字
    server.bind(('127.0.0.1',8080))   # 绑定服务端ip_port
    
    while True:
        data,client_addr=server.recvfrom(1024)  # 接受客户端数据内容和客户端ip_port
        print('===>',data,client_addr)
        server.sendto(data.upper(),client_addr) # 发送返回值给客户端,sendto(数据处理,客户端地址)
    
    server.close()
    udp传输服务端
    import socket
    
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报协议-》udp  生成基于udp协议的套接字
    
    while True:
        msg=input('>>: ').strip() #msg='' # 传过去的是空字符,服务端也会有返回值b‘’,因为基于udp协议是数据包协议传输,有报头。
        client.sendto(msg.encode('utf-8'),('127.0.0.1',8080))  # sendto(字节内容+ 服务端地址)
        data,server_addr=client.recvfrom(1024)  # 接收数据返回处理的数据内容和服务端ip_port
        print(data)
    
    client.close()
    udp传输客户端

    udp传输存在粘包问题

    import socket
    # udp协议不存在粘包问题,只有数据丢失。一般用在数据访问,qq也用的udp。
    server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  # 数据报协议-》udp(SOCK_DGRAM)
    server.bind(('127.0.0.1',8080))  # 服务端还是需要绑定ip_port
    
    data,client_addr=server.recvfrom(1)  # b'hello'==>b'h' 在windows下会直接报错,unix和linux会接受1个字节。
    # 这里的recvfrom返回一个元组,分别是数据和客户端ip和端口
    print('第一次:',client_addr,data)
    
    data,client_addr=server.recvfrom(1024) #b'world' =>b'world' # udp时发送数据包,包含报头和数据内容
    # 即使发送空字符,他也会接受报头,而不是还在等待接受。如果数据过大,udp协议传输会直接造成数据丢失,不可靠传输。
    # 而不是和tcp传输一样,在不解决粘包的情况下,下一条命令依然接受上一条命令请求的内容。
    print('第二次:',client_addr,data)
    #
    # data,client_addr=server.recvfrom(1024)
    # print('第三次:',client_addr,data)
    
    server.close()
    udp粘包问题服务端
    import socket
    
    client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报协议-》udp
    
    client.sendto('hello'.encode('utf-8'),('127.0.0.1',8080)) # sendto 后面跟着发送的字节形式内容以及服务端ip_port
    client.sendto('world'.encode('utf-8'),('127.0.0.1',8080))
    # client.sendto(''.encode('utf-8'),('127.0.0.1',8080))
    
    client.close()
    udp粘包问题客户端

    udp传输一些总结:

      

    服务端
    udp协议没有粘包

    一次发送只能有一个接收

    没有监听,没有accept

    udp协议时数据包协议 没有发送空一说 每个数据都自带报头

    人数多,数据量大都会影响伪并发(udp传输不需要建立连接,发出请求直接在客户端开启一个进程,少数进程看起来像是在并发)

    udp通常用在查询方面 qq基于udp 稳定传输512字节以内的数据
  • 相关阅读:
    cnblog项目--20190309
    django js引入失效问题
    Python老男孩 day16 函数(六) 匿名函数
    Python老男孩 day16 函数(五) 函数的作用域
    Python老男孩 day15 函数(四) 递归
    Python老男孩 day15 函数(三) 前向引用之'函数即变量'
    Python老男孩 day15 函数(二) 局部变量与全局变量
    Python老男孩 day14 函数(一)
    Python老男孩 day14 字符串格式化
    Python老男孩 day14 集合
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9289560.html
Copyright © 2011-2022 走看看