接上文Python开发从零开始-48.5-网络编程,本文小编与大家分享 Python 网络编程的相关知识。
(3)使用 socket 模块进行 UDP 通信
代码示例将分为服务器端脚本和客户端脚本两个部分。
1)服务器端脚本(udp_server_socket.py)
import socketimport time# 创建服务器端 UDP socket 对象udp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定地址和端口udp_server_socket.bind(("127.0.0.1", 10001))print(f"UDP 服务器已启动")try:while True:# 接收数据 (最多 1024 字节) 和客户端地址data, client_addr = udp_server_socket.recvfrom(1024)print(f"收到来自客户端{client_addr} 的消息: {data.decode()}")response = f"服务器端已收到客户端{client_addr}发送来的信息:{data.decode()}"# 向该客户端发送响应udp_server_socket.sendto(response.encode(), client_addr)# 设置休眠时间(注意时间需略长),使程序能够接受键盘输入time.sleep(5)# 当终端运行Python 程序时,使用 Ctrl + C 组合键,将触发 KeyboardInterrupt 异常except KeyboardInterrupt:print("服务器关闭")finally:udp_server_socket.close()
上面服务器端脚本中使用的 socket 对象的常用方法简单介绍如下:
socket.recvfrom(len) 方法:接收指定长度(len)的 UDP 数据,与 socket.recv() 方法类似,但返回值是一个元组(data, address)。其中 data 是包含接收数据的字符串,address 是发送数据的元组(host, post);
socket.sendto(data,addr) 方法:发送 UDP 数据,将数据发送到指定 socket,addr是形式为(host,port)的元组,指定远程地址。返回值是发送的字节数。
2)客户端脚本(udp_client_socket.py)
import socket# 创建客户端 UDP socket 对象udp_client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 保存服务器端地址和端口server_addr = ("127.0.0.1", 10001)try:message = "【你好!这是来自客户端的 UDP 消息】"# 直接发送数据到服务器端udp_client_sock.sendto(message.encode(), server_addr)# 接收服务器端响应data, s_addr = udp_client_sock.recvfrom(1024)print(f"{data.decode()}")finally:udp_client_sock.close()
3)使用终端分别运行服务器端脚本(udp_server_socket.py)和客户端脚本(udp_client_socket.py)
① 客户端脚本运行结果如下

② 服务器端脚本运行结果如下

3、socket 模块使用注意事项
(1)注意异常处理
在使用 socket 模块时,网络操作可能会失败(特别是 TCP 通信时),例如因为网络中断、服务器不可用等原因。因此,需要使用 try...except 块来捕获并处理。常见异常包括:
socket.timeout,在使用 socket 模块进行网络通信时,若连接或读取数据超出设定的时间限制,就会抛出 socket.timeout 异常。这通常是由于网络延迟、目标服务器无响应或超时时间设置过短导致;
socket.error,表示在使用 socket 模块进行网络通信时出现了问题,例如权限不足、端口被占用或连接超时等;
KeyboardInterrupt,它是 Python 中的内置异常,当终端运行程序时,用户按下 Ctrl+C 中断程序时触发。注意在程序进入无限循环(如 while True)或处理大量数据时,需显式对程序进行短暂休眠,否则无法接收终端输入。
(2)关闭 Socket 连接
当使用完 socket 后,应该始终关闭它,否则可能导致资源泄露。
(3)设置网络超时时间
在网络编程中,应设置一个合理的超时时间,以避免无限期地等待服务器响应。可以使用 socket 对象的 settimeout() 方法来设置超时时间,通常应该在刚创建 socket 对象时设置,因为可能用于连接的操作。
(4)数据传输的安全性
应避免明文传输敏感信息,建议采用 ssl 模块提供的 SSL/TLS(安全套接层/传输层安全协议)功能来加密数据传输。
(5)并发处理
使用 socket 模块进行网络编程时,特别是在处理 TCP 连接时,通常会遇到同时处理多个客户端连接问题。如果需要在单进程内同时处理多个客户端连接,可以使用 socket 模块结合 asyncio 模块来以非阻塞的方式处理网络通信。
(6)多线程处理
在实际应用中,为了提高性能和健壮性,通常会采用多线程或多进程来处理多个客户端连接。例如,可以使用 threading 模块为每个客户端连接创建一个新线程。
受文章篇幅所限,下文将继续介绍 Python 网络编程的相关知识。