2016-08-11 1 views
-2

File Server Неполадка загрузки Python 2.5.1File Server Загрузить Python

Так я работаю на файловом сервере, как проект хобби. Однако у меня проблемы. Я могу использовать клиент для успешной загрузки файла на сервер, но скажем, что файл для загрузки составляет 50 000 байт (50 мб), он будет загружать только 49,945 байт, а затем, если я попытаюсь открыть его, он скажет, что он поврежден. Если я закрою сервер, он будет работать до 50 000, тогда работает. Есть ли способ исправить это, если сервер не нуждается в закрытии и повторном открытии?

(Загрузка Doesnt есть эта проблема)

Полный код клиента: Client

Полный сервер: Server

Клиент Выгрузка Функция:

def Uploader(s): 
    IsReal = True 
    data = "UploaderReady" 
    if data == "UploaderReady": 
     List = [] 
     FilePath = dir_path = os.path.dirname(os.path.realpath(__file__)) 
     List.append(os.listdir(FilePath)) 
     FileUpload = raw_input("Pick a file? -> ") 
     for Item in List: 
      if FileUpload == Item: 
       IsReal = True #checks if item exists 
     if IsReal == True: 
      File = open(FileUpload,'rb') 
      bytestosend = File.read(1024) 
      FileSize = os.path.getsize(FileUpload) 
      s.send(FileUpload) 
      s.send(str(FileSize)) 
      s.send(bytestosend) 
      while bytestosend != "": 
       bytestosend = File.read(8192) 
       s.send(bytestosend) 
      print"Processing" 
      File.close() 
      time.sleep(1.5) 
      s.send("COMPLETE") 
      print"File Successfully Uploaded" 
      time.sleep(2) 
      print" \n " * 10 
      Main() 
     if IsReal == "False": 
      print"Item doesn't Exist" 
      time.sleep(2) 
      print" \n " * 10 
      s.close() 
      Main() 

Сервер загрузки Функция:

Todo = sock.recv(1024) 
if Todo == "U": 
    print str(addr)+" Uploading" 
    UploadingThread = threading.Thread(target=Uploader,args=(c,c,)) 
    UploadingThread.start() 

def Uploader(c,s): 
    filename = s.recv(1024) 
    filesize = s.recv(1024) 
    f = open(filename,'wb') 
    totalRecv = 0 
    while totalRecv < filesize: 
     FileContent = s.recv(8192) 
     totalRecv += len(FileContent) 
     f.write(FileContent) 
    print"Download Complete" 
    f.close() 
    s.close() 
+0

Пытались ли вы с меньшими файлами? –

+0

Попробуйте закрыть сокет, когда вы закончите загрузку на стороне клиента. –

ответ

0

Вы закрываете клиентское соединение на стороне сервера, но никогда не закрываете его на стороне клиента, так как Cory Shay сказал.
Вместо того чтобы закрыть его, хотя, вы должны shutdown сокет и сигнализировать это делается письменной форме с s.shutdown(socket.SHUT_WR)

Вот как это должно выглядеть для клиента:

def Uploader(s): 
    IsReal = True 
    data = "UploaderReady" 
    if data == "UploaderReady": 
     List = [] 
     FilePath = dir_path = os.path.dirname(os.path.realpath(__file__)) 
     List.append(os.listdir(FilePath)) 
     FileUpload = raw_input("Pick a file? -> ") 
     for Item in List: 
      if FileUpload == Item: 
       IsReal = True #checks if item exists 
     if IsReal == True: 
      File = open(FileUpload,'rb') 
      bytestosend = File.read(1024) 
      FileSize = os.path.getsize(FileUpload) 
      s.send(FileUpload) 
      s.send(str(FileSize)) 
      s.send(bytestosend) 
      while bytestosend != "": 
       bytestosend = File.read(8192) 
       s.send(bytestosend) 
       print"Processing" 
      s.shutdown(socket.SHUT_WR) # End the writing stream 
      print(s.recv(1024)) # Expecting the server to say 'upload complete' 
      s.close() # close the socket 
      File.close() 
      time.sleep(1.5) 
      s.send("COMPLETE") 
      s.close() #To close connection after uploading 
      print"File Successfully Uploaded" 
      time.sleep(2) 
      print" \n " * 10 
      Main() 

и сервером:

def Uploader(c,s): 
    filename = s.recv(1024) 
    filesize = s.recv(1024) 
    f = open(filename,'wb') 
    totalRecv = 0 
    while totalRecv < filesize: 
     FileContent = s.recv(8192) 
     totalRecv += len(FileContent) 
     f.write(FileContent) 
    s.send("Upload Complete!") # Tell client the upload is complete 
    print"Download Complete" 
    f.close() 
    s.close() # Close the socket 

Также вы передаете сервер Uploader 2 идентичных аргумента, и только один, вместо этого вы должны просто передать один:

UploadingThread = threading.Thread(target=Uploader,args=(c,c,)) 
# should be 
UploadingThread = threading.Thread(target=Uploader,args=(c,)) 

Аналогично, ваш пароль нить нужно только 2:

c, addr = s.accept() 
print"Client Connection: <"+str(addr)+">" 
PasswordThread = threading.Thread(target=Password,args=(c,addr)) 

def Password(c,addr): 
    c.send("WAITINGPASSWORD") 
    PASSWORD = "123" 
    password = c.recv(1024) 

и ваша проверка функция пароля может быть проще:

def Password(c,addr): 
    password = "123" 
    c.send("WAITINGPASSWORD") 
    attempt = c.recv(1024)[::-1] 
    if attempt == password: 
     doStuff() 
+0

Спасибо Ксандер Лучано. это почти сработало. но он застревает в s.send («Загрузка завершена!»). Это может быть причиной im на python 2.5.1, а не python 3. Вы спросили: «Вы пробовали файлы меньшего размера?» Мне понравилось 500 кбс, он не работал, мне все еще нужно закрыть сервер. если бы у вас был пересмотренный ответ, это было бы здорово. – Rogocraft

+0

Если этот ответ помог, вы должны перенести или принять ответ. Никакие другие ответы не были отправлены за 4 дня, поэтому, возможно, подумайте о том, чтобы опубликовать новый вопрос, если у вас есть дополнительные проблемы. @Rogocraft –