Как получить файлы с сервера в Python?

Я сделал скрипт на python, где вы можете отправлять файлы на удаленный сервер и получать их. Я могу отправить их на сервер, но не могу восстановить их обратно. Я подключил и server, и client.py

Server.py

import socket   # Import socket module
import os
s = socket.socket()
s.bind(('139.59.173.187', 8010)) # Binds port and IP address
s.listen(3)    #wait for client to join
c, addr = s.accept()
def RecvFile():
    print ("File is comming ....")

    file = c.recv(1024)     #recieves file name from client
    print(file)

    f = open(file,'wb')      #open that file or create one
    l = c.recv(4096)         #now recieves the contents of the file
    while (l):
        print ("Receiving...File Data")
        f.write(l)            #save input to file
        l = c.recv(4096)      #get again until done
    print("The file",file,"has been succesfully saved to the server\nConnection from:",addr)
    f.close()

def SendFile():
    file = c.recv(1024)
    print(file)
    with open(file,'rb') as f:
        c.sendall(f.read())
    print("File has been sent to the client:", addr)
    main()


def main():
    option = str(c.recv(1024), 'utf-8')
    print(option)

    if option[:1] == "R":
        SendFile()
    elif option[:2] == "S":
        RecvFile()

main()
s.close()

Client.py

import time
import socket
import sys
import urllib.request
#import paramiko
def login():
    a = 1
    while a == 1:
        global user
        user = input("Username:")
        passw = input("Password:")
        with open('User.txt') as f:
         for line in f.readlines():
             us, pw = line.strip().split("|", 1)
             if (user == us) and (passw == pw):
                 print("login Successful!")
                 a = a+1
                 main()
                 return

        print("Incorrect details, Try again!")



def register():
    print("You will recieve a generated Username from your Name and age")
    regName = input("First Name: ")
    regAge = input("Age: ")
    regPass = input("Password: ")
    regUser = (regName[0:3]+regAge)
    with open('User.txt', 'a') as file:

        file.writelines(regUser+"|"+regPass+"\n")
    print("You have Succesfully registered")
    print("Your Username is:"+regUser)
    print("Your Password is:"+regPass)
    print("!Please keep these credentials secure!")

def main():
    print("=========================Welcome to Bluetooth Projector=========================")
    option = input("Here are your options:\n--> Press C to connect to the projector\n--> Press F for File System")
    x = 1
    while x == 1:
        if option == "C" or option == "c":
            optionc(x)
        elif option == "F" or "f":
            File_System()

def optionc():
        print("Loading.....")
        time.sleep(2)

        print("Obtaining IP addres.....")
        time.sleep(2)
        print("Connecting.....")
        time.sleep(3)
        print("Connected")
        x = x+1


def File_System():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('139.59.173.187',8010))

    print("=========================Welcome to the File System =========================")
    option = input("Here are your options:\n--> Press S to upload files\n--> Press R to retrieve files")
    if option == "S" or option == "s":
        s.send("S".encode('utf-8'))

        file_name = input("Please input the file name\n>>>")
        name = input("What would you like it to be saved as?\n>>>")

        s.send(name.encode('utf-8'))
        with open(file_name,'rb') as f:
            s.sendall(f.read())
        print("File has been sent to the server")
        main()

    elif option == "R" or option == "r":
        s.send("R".encode('utf-8'))
        filename = input("What is the filename you wish to recieve\n>>>")
        s.send(filename.encode('utf-8'))

        print ("File is comming ....")
        f = open(filename,'wb')      #open that file or create one
        l = s.recv(1024)         #now recieves the contents of the file
        while (l):
            print ("Receiving...File Data")
            f.write(l)            #save input to file
            l = s.recv(1024)
        print("The file",filename,"has been succesfully saved to your computer")
        f.close()
while True:
    check = input("Do you already have an account? Y/N \n ")

    if check == "Y" or check == "y":
        login()
        break

    elif check == "N" or check == "n":
        register()
        break
    else:
        print("pleae enter either Y or N")

Пожалуйста, посмотрите на файловую систему () в файле клиента. Я думаю, что это получение второй волны байтов при получении файлов, которая является проблемой

ошибка была либо сломана труба, которую я исправил. Но теперь фактически принимающий файловый цикл не проходит и перестает получать байты файла. Я считаю, что это моя ошибка. Однако я запутался, поскольку мой код практически идентичен отправке файла на сервер, что не вызывает сложностей.

0 ответов

Но теперь фактически получающий файловый цикл не проходит и перестает получать байты файла. Я считаю, что это моя ошибка.

Вы правы. Клиент не получает указаний на то, что больше не осталось содержимого файла, и поэтому продолжает ждатьrecvнавсегда. Чтобы исправить это, вы можете позволить серверу отключать соединение, когда файл был отправлен, или, если вы хотите, чтобы соединение сохранялось, проинформировать клиента о том, когда он должен прекратить прием, например, отправив ему длину файла заранее..

Другие вопросы по тегам