欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

树莓派使用python socket与pc传输文件

程序员文章站 2022-04-24 11:06:31
...

服务器端

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')

注意事项

遇到的最大一点错误就是,传输完成后没有关闭连接,所以导致程序一直在运行没有结束传输。
虽然客户端使用了两个线程,但是应该直接使用函数来存储文件就欧克了