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

目录

API说明:1.创建套接字2.绑定本地信息(ip和port)3.接收数据4.关闭套接字

基本例程注意事项总结

欢迎关注 『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秒钟一直发送数据包,我们这个测试程序是接收一次数据就会结束,所以后期可以封装成函数多次循环,接受更多数据。

成功接收数据后的效果截图

接收数据流程:

创建客户端套接字绑定本地信息(ip和port)接收数据关闭套接字

# @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例程) 【更多内容敬请期待】