服务器端
import socket
import threading
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本机名
hostname = socket.gethostname()
# 获取本机ip
ip = socket.gethostbyname(hostname)
server.bind(('192.168.43.52', 8000))
server.listen(5)
print('服务器启动成功')
def receive_file(c_id):
try:
# 文件传输
with open("receve.png", "wb") as file:
while True:
# 接收数据
file_data = c_id.recv(1024)
# 数据长度不为0写入文件
if file_data:
file.write(file_data)
# 数据长度为0表示下载完成
else:
print('传输完成')
break
# 下载出现异常时捕获异常
except Exception as e:
print("下载异常", e)
# 无异常则下载成功
else:
print("下载成功")
def run(c_id):
com = input('please input')
# 这里必须输入1 客户端才开始传输文件
c_id.send(com.encode('utf-8'))
threading.Thread(target=receive_file, args=(client_id,)).start()
while True:
client_id, client_address = server.accept()
# print()
print(client_address, '连接成功')
threading.Thread(target=run, args=(client_id,)).start()
客户端
# coding=utf-8
from picamera import PiCamera, Color
from time import sleep
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def send_file(file_path):
try:
# 数据传输
with open(file_path, "rb") as file:
while True:
# 读取文件数据
file_data = file.read(1024)
# 数据长度不为0表示还有数据
if file_data:
client.send(file_data)
# 数据为0表示传输完成
else:
print("传输成功")
break
except Exception as e:
print("传输异常:", e)
ip = '192.168.43.52'
# 连接服务器
a=client.connect((ip, 8000))
print('connect successful')
file_path='/home/pi/Desktop/Photo.png'
while True:
recv_com = client.recv(1024).decode('utf-8')
print(recv_com)
if recv_com=='1':
send_file(file_path)
# 这里需要设置传输完成后手动关闭本连接,要不然服务器会一直等待。
client.close()
break
client.close()
print('Done')
注意事项
遇到的最大一点错误就是,传输完成后没有关闭连接,所以导致程序一直在运行没有结束传输。
虽然客户端使用了两个线程,但是应该直接使用函数来存储文件就欧克了