Skip to main content

局域网内的广播通信 —— Python实践教程


1. 什么是局域网广播通信

局域网(LAN, Local Area Network)是指覆盖范围较小的计算机网络,比如学校、家庭或办公室内部的网络。广播通信是一种网络通信方式,允许一个主机向局域网内所有设备同时发送消息,常用于发现服务、群体通知等场景。

2. UDP 广播的原理简介

UDP(User Datagram Protocol)是一种无连接的网络协议,支持快速、简单的数据传输。UDP 允许使用特殊的广播地址(如 255.255.255.255),将数据包发送到同一局域网内的所有主机。所有监听该端口的设备都能收到消息。

UDP广播示意图
UDP广播示意图
ROS2的话题通信示意图
ROS2的话题通信

3. Python 实现局域网广播通信的基本思路

  • 使用 Python 的 socket 库创建 UDP 套接字
  • 服务器端设置为广播模式,定时向局域网广播消息
  • 客户端监听指定端口,接收并显示广播消息

4. 代码讲解

broadcast_on_lan.py 为例。

程序架构

  • 服务器端(广播消息)

    • 创建 UDP 套接字,并设置为广播类型
    • 构造消息内容,定时发送到广播地址和指定端口
  • 客户端(接收消息)

    • 创建 UDP 套接字,绑定到本机所有 IP 的指定端口
    • 持续接收并显示来自服务器的广播消息

程序代码

🔒

受保护的内容

请输入密码以查看此内容

用法说明

本程序用于在局域网(LAN)内通过UDP广播实现主机与客户端的消息通信。可作为“服务器”广播消息,也可作为“客户端”接收消息。服务器和客户端可在同一局域网内的不同设备上运行。

【运行环境】

需安装 Python 3

运行设备需在同一局域网内

【用法】

服务器端(广播消息)

在一台主机上运行:

该主机会每2秒向局域网广播一条消息。

客户端(接收消息)

在同一局域网内的任意设备上运行:

该客户端会持续接收并显示主机广播的消息。

【参数说明】

server:以服务器模式运行,广播消息

client:以客户端模式运行,接收消息

【中止方法】

在终端按下 Ctrl+C 可停止程序运行

【注意事项】

服务器和客户端需在同一局域网内,且端口号(默认50000)需一致

某些操作系统或防火墙可能会阻止UDP广播,请确保相关端口已开放

如需修改端口或广播内容,可直接编辑源代码相应部分。

关键代码解析

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # 创建UDP套接字
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # 设置为广播
s.sendto(msg.encode('utf-8'), (BROADCAST_IP, PORT)) # 发送广播消息
s.bind(('', PORT)) # 客户端绑定端口,监听所有IP
data, addr = s.recvfrom(1024) # 接收数据

5. 程序运行方法与演示

  1. 确保多台电脑/设备连接在同一局域网内,并已安装 Python 3。
  2. 将 broadcast_on_lan.py 文件复制到各台设备。
  3. 在一台设备上作为服务器运行:
    python broadcast_on_lan.py server
  4. 在其他设备上作为客户端运行:
    python broadcast_on_lan.py client
  5. 客户端会实时显示服务器广播的消息。

6. 常见问题与注意事项

  • 防火墙或安全软件可能会阻止 UDP 广播,请确保端口 50000 已开放。
  • 服务器和客户端必须在同一局域网内,且端口号一致。
  • 程序运行时可按 Ctrl+C 中止。

7. 课堂练习

在Linux下,利用Python及其库工具shutil获取当前磁盘的使用情况(密码:1234):

🔒

受保护的内容

请输入密码以查看此内容

任务

运行上述代码,将其中的已用空间的磁盘信息,嵌入到前面UDP广播程序broadcast_on_lan.py, 使得服务器每2秒广播一次当前磁盘的使用情况,让你的小伙伴知道。

8. 拓展思考

  • 如何让客户端也能向服务器发送消息,实现双向通信?
  • 如果要实现点对点通信,应该如何修改代码?
  • 你能否用类似方法实现一个局域网内的简易聊天室?

通过本教程,我们了解并实践局域网内的广播通信原理,并用 Python 实现一个简单的广播通信系统。而在实际应用中,这种技术可以用于设备发现、服务通知等多种场景。 希望大家在实践中不断探索和创新,提升自己的编程能力和网络通信知识。

更重要的是,我们了解到ROS2的话题通信与UDP广播的区别和联系。ROS2的话题通信是基于发布/订阅模式的,而UDP广播则是基于无连接的消息传递。 两者各有优缺点,适用于不同的场景。在下一堂课,我们将利用ROS2的发布/订阅机制,来实现本节课的简单局域网通信。 而ROS2的发布/订阅机制与UDP广播的区别在于,ROS2提供了更高层次的抽象和功能,如消息类型定义、QoS策略等,使得通信更加灵活和可靠——从而为机器人系统的分布式通信提供了强大的支持。