当client.py出现循环错误时,我无法下载,如何解决?我使用的是Pycharm,我不明白循环错误,我已经尝试了2-3个小时,我试图修复循环错误,但我不能。请帮助我.当我写文件名和下载错误.在服务器的操作没有问题.同样在客户端。当我只是运行代码,它没有走出最后的while循环,它似乎总是下载。
---------server.py-----
import socket
import threading
import os
def RetrFile(name, sock):
filename = sock.recv(1024)
print(filename)
if os.path.isfile(filename):
sock.send(b"EXISTS " + str(os.path.getsize(filename)).encode())
userResponse = sock.recv(1024)
if userResponse[:2] == 'OK':
with open(filename, 'rb') as f:
bytesToSend = f.read(1024)
sock.send(bytesToSend)
while bytesToSend != "":
bytesToSend = f.read(1024)
sock.send(bytesToSend)
else:
sock.send(b"ERR ")
sock.close()
def Main():
host = '127.0.0.1'
port = 5001
s = socket.socket()
s.bind((host, port))
s.listen(5)
print("Server Started.")
while True:
c, addr = s.accept()
print("client connedted ip:<" + str(addr) + ">")
t = threading.Thread(target=RetrFile, args=("retrThread", c))
t.start()
s.close()
if __name__ == '__main__':
Main()
-------client.py-------
import socket
def Main():
host = '127.0.0.1'
port = 5001
s = socket.socket()
s.connect((host, port))
filename = bytearray(input("Filename? -> ").encode())
if filename != 'q':
s.send(filename)
data = s.recv(1024)
if data[:6].decode().rstrip().upper() == 'EXISTS':
filesize = int(data[6:].decode().rstrip())
message = input("File exists, " + str(filesize) + "Bytes, download? (Y/N)? -> ")
if message == 'Y' or message == 'y':
s.send(b'OK')
f = open('new_' + filename.decode(), 'wb')
data = s.recv(1024)
totalRecv = len(data)
f.write(data)
i = 0
while totalRecv < filesize:
data = s.recv(1024)
totalRecv += len(data)
f.write(data)
print("{0:.2f}".format((totalRecv / float(filesize)) * 100) + "% Done")
print("Download Complete!")
f.close()
else:
print("File Does Not Exist!")
s.close()
if __name__ == '__main__':
Main()
我理解客户端不能下载文件是因为它不从服务器发送文件.Client.py发送字节响应到server.py当它进行比较时,它返回false.服务器没有发送文件,因为if没有给出true.我改变了if语句像这样,可能这将给出true并发送文件。
if userResponse == b'OK':
with open(filename, 'rb') as f:
bytesToSend = f.read(1024)
sock.send(bytesToSend)
while bytesToSend != "":
bytesToSend = f.read(1024)
sock.send(bytesToSend)