2025年1月22日(网络编程)
系统信息:
ubuntu 16.04LTS
Raspberry Pi Zero 2W
系统版本: 2024-10-22-raspios-bullseye-armhf
Python 版本:Python 3.9.2
已安装 pip3
支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480)
已安装 vim
已安装 git
学习目标:
- 网络编程
- udp
学习内容:
CA CE
udp 基本使用
循环发送
循环发送
import socket
def main():
# 1. 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 绑定本地信息
udp_socket.bind(("192.168.0.178", 8080))
# 3. 接收数据
recv_data = udp_socket.recvfrom(1024)
# 4. 打印接收的数据
# 元组
# (b'Welcome to NetAssist', ('192.168.0.178', 8081))
print(recv_data)
# 5. 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
解析接收的数据
import socket
def main():
# 1. 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 绑定本地信息
udp_socket.bind(("192.168.0.178", 8080))
while True:
# 3. 接收数据
recv_data = udp_socket.recvfrom(1024)
# 4. 打印接收的数据
# 元组
# (b'Welcome to NetAssist', ('192.168.0.178', 8081))
print(recv_data)
recv_msg = recv_data[0]
recv_addr = recv_data[1]
print("%s : %s" % (str(recv_addr), recv_msg.decode("utf-8")))
# BUG
if recv_msg.decode("utf-8") == "exit":
break
# 5. 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
绑定端口发送数据
import socket
def main():
# 创建一个 udp 套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地信息
udp_socket.bind(("192.168.0.178", 8080))
while True:
# 发送的数据
send_data = input("请输入:")
# 用户选择关闭
if send_data == "exit":
break
# 收发数据
udp_socket.sendto(send_data.encode("utf-8"), ("192.168.0.178", 8081))
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
在使用 Python 的 socket 模块进行网络编程时,可能会遇到阻塞(blocking)问题。阻塞通常发生在网络 I/O 操作中,例如 recv() 或 accept() 方法,这些操作会等待数据到达或客户端连接,导致程序暂停执行。
在通信和数据传输中,单工、半双工和全双工是三种不同的通信模式。它们的主要区别在于数据传输的方向性。以下是这三种模式的简要说明:
1. 单工 (Simplex)
- 定义:单工通信是指数据只能单向传输的模式。信息只能从发送方传输到接收方,接收方无法向发送方发送信息。
- 例子:电视广播、传统的广播电台。
2. 半双工 (Half-Duplex)
- 定义:半双工通信允许数据在两个方向上传输,但不能同时进行。在任何时刻,数据只能在一个方向上传输。
- 例子:对讲机、一些无线通信设备。
3. 全双工 (Full-Duplex)
- 定义:全双工通信允许数据在两个方向上同时传输。发送方和接收方可以同时发送和接收信息。
- 例子:电话通话、现代网络通信(如以太网)。
总结表
通信模式 | 传输方向 | 示例 |
---|---|---|
单工 | 单向 | 电视广播 |
半双工 | 双向(不同时) | 对讲机 |
全双工 | 双向(同时) | 电话通话 |
这些通信模式在不同的应用场景中有各自的优势和局限性,选择合适的模式可以提高通信效率和效果。
udp聊天
import socket
def send_data(udp_socket):
sd_data = input("请输入:")
udp_socket.sendto(sd_data.encode("utf-8"), ("192.168.0.178", 8081))
def recv_data(udp_socket):
rv_data = udp_socket.recvfrom(1024)
# 打印接收的数据
recv_msg = rv_data[0]
recv_addr = rv_data[1]
print("%s : %s" % (str(recv_addr), recv_msg.decode("utf-8")))
def main():
# 创建一个 udp 套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_socket.bind(("192.168.0.178", 8080))
while True:
print("--- 选项 ---")
print("1.发送")
print("2.接收")
print("3.退出")
print("-----------")
op = input("请输入:")
# 发送的数据
if op == "1":
send_data(udp_socket)
# 收数据
elif op == "2":
recv_data(udp_socket)
elif op == "3":
break
else:
print("输入有误")
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()