Skip to main content
 首页 » 编程设计

python之使用python socket编程将图像文件从服务器传输到客户端

2025年05月04日10tintown

我正在从事一个项目,其中图像由我的 Android 手机拍摄并存储在我的 SD 卡中的文件夹中。我正在编写一个 python 脚本,该脚本需要定期将文件夹从 SD 移动到我 PC 中的特定文件夹。手机和 PC 通过移动热点连接。

我写了一个套接字程序,我的电脑是客户端,手机是服务器。但我面临着一些问题。虽然我无法移动文件夹,但我尝试从文件夹中移动图像,但我遇到了以下问题

  • 图像以未知文件格式的形式复制。
  • 我无法在服务器端重复该过程来移动文件夹中存在的所有图像
  • 在客户端,我无法将其存储在我想要的位置。我尝试在发送图像之前从服务器发送文件夹名称和文件名,但客户端没有使用我发送的文件名,而是搜索具有该名称的文件夹。
  • 我还有一个关于发送到客户端的名称大小的问题,我如何根据从服务器发送的名称在客户端随机更改大小。

我需要有人帮助解决这个问题。

这是客户端代码

import socket,os 
import time 
 
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client_socket.connect(("192.168.43.1", 5005)) 
 
size = 1024 
 
while True: 
    fln = client_socket.recv(size) # folder name 
    fn = client_socket.recv(size) # file name 
    fname = "E:\\Transfered\\"+fln+"\\"+fn 
    fp = open(fname,'w') 
    while True: 
        strng = client_socket.recv(1024) 
        if not strng: 
            break 
        fp.write(strng) 
    fp.close() 
    print "Data Received successfully" 
    exit() 
    #data = 'viewnior '+fname 
    #os.system(data) 

我的服务器端代码

import os    
import sys,time  
import socket 
 
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_socket.bind(("", 5005)) 
server_socket.listen(5) 
 
client_socket, address = server_socket.accept() 
print "Conencted to - ",address,"\n" 
 
sb = '/mnt/sdcard/sb' 
 
while True: 
    files = os.listdir(sb) 
    pages = 0; 
    while (files): 
    print '\nMaybe, pending work' 
    for au in files: 
        if (au.find('d')>-1): # searching for folder with a d 
            os.chdir(sb+'/'+au) 
            imgFiles = os.listdir(sb+'/'+au) 
            images = [img for img in imgFiles if img.endswith('.jpg')] 
            print '\n%s user done' %au 
            client_socket.send(au) 
            pages = 0; 
            #copies all .img files in the folder from server to client 
            for imgs in images: 
                print imgs 
                client_socket.send(imgs) 
                file_name = open(imgs,'r') 
                while True: 
                    strng = file_name.readline(1024) 
                    if not strng: 
                        break 
                    client_socket.send(strng) 
                file_name.close() 
                print "Data sent successfully"                       
                os.remove(sb+'/'+au+'/'+imgs) 
                pages = pages + 1 
 
            time.sleep(1) 
            os.chdir(sb) 
            os.rmdir(au) 
 
        else: 
            time.sleep(2)  
        exit() 

请您参考如下方法:

问题似乎是在服务器端对二进制文件使用 readline():

file_name = open(imgs,'rb') 
while True: 
strng = file_name.readline() 

readline() 从文件中读取数据直到下一个 '\n' 字符。在二进制文件上使用它可能会导致读取一个非常长的缓冲区! (甚至可能达到 EOF)。在这种情况下,使用 socket.send() 可能无法传递整个数据,并且应该检查返回值(=传输的字节数)。修复的可能性是:

  1. 发送时使用socket.sendall(),将发送整个缓冲区。

或者,或者(可以同时使用)

  1. 使用 file_name.read(1024) - 这将限制每个周期读取的数据量。