UDP发送端
实现步骤
socket.socket
—— 创建套接字 ```python “”” socket 参数说明
- socket.AF_INET 表示 IPv4 地址
- socket.SOCK_DGRAM 表示使用 UDP 协议传输数据 “”” udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ```
socket.bind((IP地址, 端口号))
—— 绑定到一个地址(可选)
这个地址必须是没有被占用的,否则会连接失败。不进行bind
,系统会随机分配一个端口
# ip地址 端口号
addr = ("192.168.23.122", 3333)
udp_socket.bind(addr)
socket.sendto
—— 发送数据 ```python “”” sendto 参数说明
- 要发送的二进制数据
- 元组类型,指定把 (参数 1 的数据) 发送给谁 (ip 地址字符串,端口数值) “”” udp_socket.sendto(“你好”.encode(), (“127.0.0.1”, 8888)) ```
socket.close
—— 关闭套接字# 4. 关闭套接字(close)
udp_socket.close()
参考代码
#coding=utf-8
# 导入socket模块
import socket
# 创建socket
# AF_INET 表示IPv4地址
# SOCK_DGRAM 表示使用udp 协议
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ("192.168.23.122", 3333)
# 发送端绑定,绑定发送端的ip和端口(可选)
udp_socket.bind(addr)
# 设置内容
data_str = "哈哈,我来自火星!~"
# 把文本内容转码,转成二进制数据
data_bytes = data_str.encode("utf-8")
# 发送数据
# ("192.168.23.221", 8080) 接收数据方ip地址和端口
udp_socket.sendto(data_bytes, ("192.168.23.221", 8080))
# 关闭数据
udp_socket.close()
UDP接收端
实现步骤
socket.recvfrom(缓冲区大小)
—— 接受UDP套接字的数据。socket.recvfrom(1024) 使用udp方式接收数据,每次接收1024个字节
decode()
—— 解码,把二进制数据解码为 字符串 类型str = data.decode() 把data 解码为字符串并且保存到 str变量中
参考代码
```python
coding=utf-8
from socket import *
1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = (‘’, 7788) # ip地址和端口号,ip一般不用写,表示本机的任何一个ip udp_socket.bind(local_addr)
3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) # 1024表示本次接收的最大字节数
4. 显示接收到的数据
print(recv_data[0].decode(‘gbk’))
5. 关闭套接字
udp_socket.close()
**运行结果:**<br />![](https://cdn.nlark.com/yuque/0/2023/png/27903758/1685097912264-c37f1224-59bd-4fab-a65a-bc76ec67e971.png#averageHue=%2395826a&clientId=u628121ef-9fc3-4&from=paste&id=u4b6364f4&originHeight=1784&originWidth=2734&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u04f82951-a25e-4c2d-b71a-721b6078072&title=)
<a name="ZngSG"></a>
## UDP发广播
<a name="YYKEL"></a>
### 什么是广播?
![](https://cdn.nlark.com/yuque/0/2023/png/27903758/1685098730592-0d9ef6e8-4ec4-4a2c-b3c6-6c4e32b027fb.png#averageHue=%23f2f2f2&clientId=u9e0322dd-7e5c-4&from=paste&id=u21c45cd9&originHeight=748&originWidth=1706&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u68a2e6ce-4f3d-4e90-b059-ae462d6ce79&title=)
<a name="Ga2kq"></a>
### 实现步骤
1. 导入模块socket
2. 创建socket套接字
3. 设置允许发送广播
4. 发送广播数据(注意广播地址)
5. 关闭套接字
<a name="bfjsU"></a>
### 核心方法
- `socket.setsockopt` —— 设置允许发送广播
```python
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
参考代码
import socket
# 建立udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 发送消息
send_content = "大家好,我是渣渣辉~"
# 把文本转为二进制数据
send_data = send_content.encode("utf-8")
# 设置允许发送广播
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
# 发送消息
udp_socket.sendto(send_data, ("192.168.1.255", 9090))
# 关闭套接字
udp_socket.close()
广播地址计算
广播地址要根据当前局域网IP和子网掩码得到,在线生成网站:http://www.md5.cn/tools/subnetmask/
例如:
Window使用ipconfig
,Linux/Mac使用ifconfig
查看当前网络IPv4地址和子网掩码
当前电脑网卡IP:192.168.23.222
网卡子网掩码:255.255.255.0
,即掩码位为24
(11111111, 11111111, 11111111, 00000000)
总结
- 一个udp网络程序,可以不绑定,此时操作系统会随机进行分配一个端口,如果重新运行此程序端口可能会发生变化
- 一个udp网络程序,也可以绑定信息(ip地址,端口号),如果绑定成功,那么操作系统用这个端口号来进行区别收到的网络数据是否是此进程的