python套接字中的数据传输不完整

时间:2017-10-29 15:31:06

标签: python

我正在创建一个客户端服务器程序,客户端下载服务器的文件。它在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 + '>'

我尝试了不同的解决方案,但没有一个能够奏效!

1 个答案:

答案 0 :(得分:0)

套接字没有&#34;消息的概念&#34;因为你正在使用它们。如果您将'YES'然后'some_filename'添加到套接字上,则有可能(通过执行本地连接帮助)当您执行recv(4096)时它显示为{{{}} 'YES' 1}}而不是'YESsome_f'...

您需要自己将流解析为消息(存储收到的数据),或者添加一层包含消息的内容(如HTTP或ZMQ)。

如果您想托管文件,python -m http.server可以为您做到这一点。