【Python】接收UDP数据(保姆级图文+附测试工具文件+api例程)


欢迎关注 『Python』 系列,持续更新中
欢迎关注 『Python』 系列,持续更新中

下图来自博客园的博主——小名叫小明,说明了udp网络程序模型
在这里插入图片描述

API说明:

1.创建套接字

udp_socket = socket.socket(参数1, 参数2)
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

  • 参数1:family(给定的套接族)一般有两种重要参数
    • socket.AF_INET(用于服务器与服务器之间的网络通信)
    • socket.AF_INET6 (基于IPV6方式的服务器与服务器之间的网络通信)
  • 参数2:type(套接字类型),也是一般两个类型
    • socket.SOCK_STREAM(基于TCP的流式socket通信)
    • socket.SOCK_DGRAM(基于UDP的数据报式socket通信)
  • 说明:这里我们使用的是IP4连接所以选择socket.AF_INET;UDP数据发送所以选择socket.SOCK_DGRAM。
    简单来说,见面就是一行udp_socket = socket.socket(socket.AF_INET,cosket.SOCK_DGRAM)可以理解为英语中的固定搭配。

2.绑定本地信息(ip和port)

local_addr = (“参数1”, 参数2)
udp_socket.bind(local_addr)

local_addr = ("", 60826)
udp_socket.bind(local_addr)
  • 参数1:表示本地的ip
  • 参数2:表示本地的端口
  • 说明:本机ip可以为空,会自动获取,如果你对于ip知识不了解,并且是本机上接收UDP数据,可以为空。端口号自己设定一定要是没有被占用的端口号,建议随便输一个30000起步的。

3.接收数据

recv_data = udp_socket.recvfrom(参数1)
recv_data = udp_socket.recvfrom(1024)

  • 参数1:表示本次接收数据的最大字节数1024字节
  • 说明:等待接收对方发送的数据。如果没有接收到数据会一直等待,产生阻塞。

4.关闭套接字

udp_socket.close()

  • 直接这么写就完事儿了

基本例程

为了验证程序是否真的能接受到UDP数据,我们用网络调试助手来发送数据给本机,让我们的python程序来接收试试看。

工具下载百度链接:https://pan.baidu.com/s/19pzqqUczM7cTxbGJvPwEDA
提取码:1hs6

先运行python程序开始接收数据,因为没有检测到数据会陷入阻塞,等待发送数据
然后把网络调试助手设置成如下图,输入数据后,点击发送数据
8E 10 02 00 90 BE 0C 01 51 00 00 89 60 C2 00 00 3F 00 30 11 28 7D 8D
网络调试助手就会每隔1秒钟一直发送数据包,我们这个测试程序是接收一次数据就会结束,所以后期可以封装成函数多次循环,接受更多数据。

在这里插入图片描述
成功接收数据后的效果截图

接收数据流程:

  1. 创建客户端套接字
  2. 绑定本地信息(ip和port)
  3. 接收数据
  4. 关闭套接字
# @Time    : 2021/12/9 14:49
# @Author  : 南黎
# @FileName: 接收udp数据.py
import socket

def main():
    # 1.创建一个udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 2.绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
    # 30000  表示本地的端口 ip一般不用写
    local_addr = ("", 60826)
    udp_socket.bind(local_addr)

    # 3. 等待接收对方发送的数据
    recv_data = udp_socket.recvfrom(1024)
    # 1024表示本次接收的最大字节数

    # 4. 显示对方发送的数据
    # 接收到的数据recv_data是一个元组
    # 第1个元素是对方发送的数据
    # 第2个元素是对方的ip和端口
    # print(recv_data)#输出接收到的原始数据数据是一个元组(b'\x8e\x10\x02\x00\x90\xbe\x0c\x01Q\x00\x00\x89`\xc2\x00\x00?\x000\x11(}\x8d', ('127.0.0.1', 10360))

    #注意如果发送和解码方式不一样会报错!()type类型都是bytes,但是一个是asc一个是hex解码方式不同)
    # 2个思路我2小时没找到实现方法:1.判断编码方式结合if和else;2.用异常处理解决。因为时间紧,没时间研究了,大家集思广益一下
    # 因为博主我的项目只用于hex所以我就注释了asc,大家如果用asc可以注释掉hex

    #1.如果是Hex发送,  解码得到8e10020090be0c015100008960c200003f003011287d8d
    result_recv_data=recv_data[0].hex()
    #2.如果是ASCII发送,解码得到8E 10 02 00 90 BE 0C 01 51 00 00 89 60 C2 00 00 3F 00 30 11 28 7D 8D
    # result_recv_data = recv_data[0].decode('utf-8')

    print(result_recv_data)#
    # 3.关闭套接字
    udp_socket.close()

if __name__ == "__main__":
    main()

注意事项

  • 这里为了显示接收到的数据,进行了解码处理。
  • 如果是hex模式发送数据,使用hex解码方式得到的数据是,这些数据还要进一步的处理。8e10020090be0c015100008960c200003f003011287d8d
    ls = []
    for i in range(len(result_recv_data) // 2):
        ls.append(result_recv_data[i * 2] + result_recv_data[i * 2 + 1])
    return ls

才会得到8E 10 02 00 90 BE 0C 01 51 00 00 89 60 C2 00 00 3F 00 30 11 28 7D 8D

  • 如果是asc码模式发送数据,使用.decode('utf-8')解码得到的数据是8E 10 02 00 90 BE 0C 01 51 00 00 89 60 C2 00 00 3F 00 30 11 28 7D 8D

总结

大家喜欢的话,给个👍,点个关注!继续跟大家分享敲代码过程中遇到的问题!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2021 mzh

Crated:2021-12-10

欢迎关注 『Python』 系列,持续更新中
欢迎关注 『Python』 系列,持续更新中
【Python安装第三方库一行命令永久提高速度】
【使用PyInstaller打包Python文件】
【Python】发送udp数据(保姆级图文+附测试工具文件+api例程)
【Python】接收UDP数据(保姆级图文+附测试工具文件+api例程)
【更多内容敬请期待】


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发现你走远了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值