如何通过Socket从Python代码向树莓派(Rpi)写入文件?
实现Python客户端向树莓派Socket服务端写入文件内容
你的问题出在对Socket连接对象的误解:conn是Socket连接实例,没有open方法,无法直接操作客户端的文件。正确的逻辑是客户端读取本地文件内容,通过Socket发送给树莓派服务端,服务端接收数据后写入本地文件。
以下是完整实现方案:
树莓派(服务端)代码
服务端负责监听连接、接收客户端发送的文件内容,并写入指定路径的文件:
import socket TCP_IP = '0.0.0.0' # 监听所有网卡 TCP_PORT = 12345 BUFFER_SIZE = 1024 # 每次接收的字节数 FILE_PATH = '/home/pi/received_file.txt' # 树莓派上的目标文件路径 # 创建Socket并启动监听 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((TCP_IP, TCP_PORT)) s.listen(1) print(f"等待客户端连接,监听端口 {TCP_PORT}...") conn, addr = s.accept() print(f"已连接客户端: {addr}") # 打开文件准备写入 with open(FILE_PATH, 'wb') as f: while True: # 循环接收数据 data = conn.recv(BUFFER_SIZE) if not data: # 客户端关闭连接时,recv返回空 break f.write(data) print("文件接收并写入完成") conn.close() s.close()
Python客户端代码
客户端负责读取本地文件,通过Socket发送给服务端:
import socket TCP_IP = '树莓派的IP地址' # 替换为树莓派实际IP,比如192.168.1.100 TCP_PORT = 12345 BUFFER_SIZE = 1024 LOCAL_FILE_PATH = 'local_file.txt' # 要发送的本地文件路径 # 连接服务端 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) # 读取本地文件并发送 with open(LOCAL_FILE_PATH, 'rb') as f: while True: data = f.read(BUFFER_SIZE) if not data: break s.sendall(data) print("文件发送完成") s.close()
关键注意事项
- 路径与权限:树莓派服务端的
FILE_PATH要确保有写入权限,优先选择用户目录下的路径,避免写入系统目录。 - 大文件处理:代码采用分块读写的方式,适合大文件传输,不会一次性占用过多内存。
- 异常处理:实际使用中可添加
try-except块,处理网络中断、文件读写失败等异常情况。 - 结束标记:如果需要明确标识文件传输结束,可在客户端发送完文件后发送约定的结束符(如
s.send(b'EOF')),服务端接收时判断到该结束符后停止写入。
内容的提问来源于stack exchange,提问作者vmon
相关产品推荐
相关产品推荐

