簡體   English   中英

使用python套接字編程將圖像文件從服務器傳輸到客戶端

[英]Transferring image files from sever to client using python socket programming

我正在研究一個項目,其中圖像由我的Android手機拍攝並存儲在SD卡的文件夾中。 我正在處理一個python腳本,該腳本需要定期將文件夾從SD移到PC中的特定文件夾。 手機和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) -將限制每個周期讀取的數據量。

我已經修改了代碼,足以解決許多問題,現在我要解決的唯一問題是圖像傳輸。 我在客戶端打開一個.jpg文件,並將數據寫入其中。 但是最終文件的大小僅比原始大小小1kb。 我想如果解決這個問題,我的工作就會完成。 有人可以幫我嗎。

繼承人的代碼

服務器:

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

                #copies all .img files in the folder from server to client
                for imgs in images:
                    client_socket.send(imgs)
                    file_name = open(imgs,'rb')
                    while True:
                        strng = file_name.readline()
                        if not strng:
                            break
                        client_socket.send(strng)
                    file_name.close()
                    os.remove(sb+'/'+au+'/'+imgs)       
                print "Data sent successfully"                          
                time.sleep(1)
                os.chdir(sb)
                os.rmdir(au)

            else:
                time.sleep(2) 
            exit()

客戶:

import socket,os
import time

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("192.168.43.1", 5005))

dst="E:\\Kiosk\\"

while True:
#folder name
fln = client_socket.recv(4)
os.chdir(dst);
dst = "E:\\Kiosk\\"+fln+"\\"
if not os.path.exists(dst): os.makedirs(dst)
fname = client_socket.recv(4)
os.chdir(dst)
fname = fname+'.jpg'
fp = open(fname,'wb')
# image
while True:
    strng = client_socket.recv(1024)
    if not strng:
        break
    fp.write(strng)
fp.close()
print "Data Received successfully"
exit()
#time.sleep(10)

#data = 'viewnior '+fname
#os.system(data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM