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字节以内的数据
  • 相关阅读:
    几个常用排序的代码实现堆排序|快排|归并排序 Marathon
    0647回文子串 Marathon
    任意输入一个日期输出是当年的第几天星期几
    从输入URL到浏览器显示页面发生了什么
    常用链接整理
    computed 与 method
    将博客搬至CSDN
    leetcode_Two Sum
    VC++6.0与Office2010冲突解决方案
    C&C++_malloc函数
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9289560.html
Copyright © 2011-2022 走看看