1

このトピックに回答があったかどうかはわかりませんが、申し訳ありませんでした:

すべてのファイルを 1 つのフォルダーに送信する単純な python スクリプトがあります。

クライアント:

import os,sys, socket, time
def Send(sok,data,end="292929"):
    sok.sendall(data + end);
def SendFolder(sok,folder):
    if(os.path.isdir(folder)):
        files = os.listdir(folder);
        os.chdir(folder);
        for file_ in files:
            Send(sok,file_);#Send the file name to the server
            f = open(file_, "rb");
            while(True):
                d = f.read();#read file
                if(d == ""):
                    break;
                Send(sok, d, "");#Send file data
            f.close();
            time.sleep(0.8);#Problem here!!!!!!!!!!!
            Send(sok,"");#Send termination to the server
            time.sleep(1);#Wait the server to write the file
        os.chdir("..");
        Send(sok,"endfile");#let the server know that we finish sending files
    else:
        Send("endfile")#If not folder send termination
try:
    sok1 = socket.socket();
    sok1.connect(("192.168.1.121",4444))#local ip
    time.sleep(1);
    while(True):
        Send(sok1,"Enter folder name to download: ");
        r = sok1.recv(1024);
        SendFolder(sok1,r);
        time.sleep(0.5);
except BaseException, e:
    print "Error: " + str(e);
    os._exit(1);

サーバ:

import sys,os,socket,time
# receive data
def Receive(sock, end="292929"):
    data = "";
    while(True):
        if(data.endswith(end)):
            break;
        else:
            data = sock.recv(1024);
    return data[:-len(end)];#return data less termination
def FolderReceive(sok):
    while(True):
        r = Receive(sok);# recv filename or folder termination("endfile")
        if(r == "endfolder"):
            print "Folder receive complete.";
            break;
        else:
            filename = r;#file name
            filedata = Receive(sok);# receive file data
            f = open(filename,"wb");
            f.write(filedata);
            f.close();#finish to write the file
            print "Received: " + filename;
try:
    sok1 = socket.socket();
    sok1.bind(("0.0.0.0",4444));
    sok1.listen(5);
    cl , addr = sok1.accept();#accepts connection
    while(True):
        r = Receive(cl);
        sys.stdout.write("\n" + r);
        next = raw_input();
        cl.sendall(next);#send folder name to the client
        FolderReceive(cl);
except BaseException, e:
    print "Error: " + str(e);
    os._exit(1);

私はこれがこれまでで最高のサーバーではないことを知っています...しかし、私が知っていることです. クライアントがサーバーを待つ時間が十分ではないため、大きなファイル(5mbなど)を送信するとクラッシュするため、これは小さなファイルを含むフォルダーに対してのみ機能します。

だから私の質問は、クライアントが待つ必要なしにサーバーにファイルを送信するにはどうすればよいですか? 同じことを行いますが、任意のファイルサイズを処理するコード、何か助けはありますか?

4

1 に答える 1