Код работает только в pycharm
Я написал программу для передачи файлов по TCP с помощью кода, вот файл sender.py:
import time
import random
import string
import socket
import codecs
from socket import SOL_SOCKET, SO_REUSEADDR
SERVER_HOST = "0.0.0.0"
port = ''
code = ''
filename=input("Enter your file: ")
file = codecs.open(filename, "rb")
while True:
for i in range(5):
codee = random.choice(string.ascii_letters.lower())
code += codee
port += str(string.ascii_letters.lower().find(codee) + 1)
if int(port[:5]) < 65535:
break
port = int(port[:5])
SERVER_PORT = port
client_sockets = set()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind((SERVER_HOST, SERVER_PORT))
s.listen(2)
print(f"[*] Tell second user to enter code: {code}")
client_socket, client_address = s.accept()
msg = client_socket.recv(1024).decode()
l = file.read(1024)
if msg == f"{code}":
client_socket.send(filename.encode('utf-8'))
while (l):
client_socket.send(l)
l = file.read(1024)
client_socket.send(b'Done')
file.close()
s.close()
print("File transfered successfully ✔")
input()
И reciever.py:
import time
import socket
import string
import codecs
SERVER_HOST = "127.0.0.1"
port = ''
code = input("Enter your code: ").replace("'", "").replace(" ", "")
for i in range(5):
try:
codee = code[i]
except:
print("Invalid code")
input()
exit()
port += str(string.ascii_letters.lower().find(codee) + 1)
port = int(port[:5])
SERVER_PORT = port
s = socket.socket()
s.settimeout(3)
print(f"[*] Connecting to server: {code}...")
try:
s.connect((SERVER_HOST, SERVER_PORT))
except:
print("Invalid code")
input()
exit()
print("[+] Connected.")
s.send(code.encode())
filename = s.recv(1024).decode('utf-8')
print("Recieving filename...")
l = s.recv(1024)
print("Recieving file...")
output = open(filename, "wb")
while (l):
if l == b"Done":
break
output.write(l)
try:
l = s.recv(1024)
except socket.timeout:
print("Timeout")
output.close()
s.shutdown(socket.SHUT_WR)
s.close()
output.close()
print("File Downloaded successfully ✔")
input()
Дело в том, что при запуске кода через pycharm все работает, но если запустить код напрямую через python - файл начинает бесконечно заполнятся с ошибкой таймаут, и к нему добавляется слово Done, которое должно останавливать цикл с передачей файла. Заранее спасибо.
Ответы (1 шт):
Автор решения: Zailox
→ Ссылка
Socket слишком быстро отправлял 2 ответа, из-за чего они миксовались, нужно было поставить sleep перед s.send()