2

Androidフォンで画像を撮影し、SDカードのフォルダーに保存するプロジェクトに取り組んでいます。SD から PC の特定のフォルダーにフォルダーを定期的に移動する必要がある Python スクリプトに取り組んでいます。電話と 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()
4

2 に答える 2

1

問題はreadline()、サーバー側でバイナリ ファイルを使用しているようです。

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

readline()ファイルから次の'\n'文字までデータを読み取ります。バイナリ ファイルで使用すると、非常に長いバッファが読み取られる可能性があります。(おそらく EOF まで)。その場合、 を使用してsocket.send()もデータ全体が配信されない可能性があるため、戻り値 (= 送信されたバイト数) を確認する必要があります。それを修正する可能性は次のとおりです。

  1. 送信時に使用socket.sendall()すると、バッファ全体が送信されます。

または、代わりに(両方を使用することもできます)

  1. using file_name.read(1024)- 各サイクルで読み取られるデータの量を制限します。
于 2013-02-09T12:08:04.570 に答える
-1

私の問題の多くを解決するのに十分なコードを修正したので、解決したい唯一の問題は画像転送です。クライアントで .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)
于 2013-01-30T19:30:13.917 に答える