我正在创建一个客户端服务器程序,客户端下载服务器的文件。它在localhost中工作正常,但问题发生在localhost连接除外。我已经尝试使用谷歌搜索,但没有一个解决方案(从以前建议到相同的问题)都有效。
这是我的代码:
def upload(sock): # server.py
filename = str(sock.recv(4096)).split(' end')[0]
if os.path.exists(filename):
sock.send('YES')
sock.send(str(os.path.getsize(filename)) + ' end')
foo = open(filename, 'rb')
upbytes = foo.read(4096)
sock.sendall(upbytes)
while upbytes != '':
upbytes = foo.read(4096)
sock.sendall(upbytes)
foo.close()
print "\tUpload Complete !"
else:
sock.send('NO')
def download(sock, filename): #client.py
sock.send(filename + ' end')
if sock.recv(4096) == 'YES':
filesize = int(str(sock.recv(4096)).split(' end')[0])
print filesize, 'filesize'
foo = open('downloaded_' + os.path.basename(filename), 'wb')
downbytes = sock.recv(4096)
foo.write(downbytes)
downlen = len(downbytes)
while downlen < filesize:
downbytes = sock.recv(4096)
if not downbytes:
break
foo.write(downbytes)
downlen += len(downbytes)
foo.close()
print 'filesize', filesize, 'downlen', downlen
print "\t\tDownload Complete !\n"
else:
print "\t\tFile not found ! <" + filename + '>'
我尝试了不同的解决方案,但没有一个能够奏效!
答案 0 :(得分:0)
套接字没有&#34;消息的概念&#34;因为你正在使用它们。如果您将'YES'
然后'some_filename'
添加到套接字上,则有可能(通过执行本地连接帮助)当您执行recv(4096)
时它显示为{{{}} 'YES'
1}}而不是'YESsome_f'...
。
您需要自己将流解析为消息(存储收到的数据),或者添加一层包含消息的内容(如HTTP或ZMQ)。
如果您想托管文件,python -m http.server
可以为您做到这一点。