python套接字文件传输

foo*_*ion 10 python sockets file-transfer

我正在尝试通过套接字写入传输文件或数据块.我觉得好像我正在重新发明轮子,但我对一个简单的解决方案的搜索失败了(我发现的一切都太简单或太复杂).服务器将在运行python 2.5.4的手机上运行.预期的应用是在电话和主机之间同步音乐文件.

这是我所拥有的内容,似乎有效.我发送并收到"确定"以分解流.

是来回发送'ok'作为停止位来分解数据流是一种合理的技术吗?

有没有标准的方法来做到这一点?

考虑到手机内存和处理能力的限制,在手机上运行任何类型的库服务器(ftp,http)都不是一个有用的解决方案.

服务器:

import socket

c = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
c.bind(('', 1234))
c.listen(1)
s,a = c.accept()

while True:
    data = s.recv(1024)
    cmd = data[:data.find('\n')]

    if cmd == 'get':
        x, file_name, x = data.split('\n', 2)
        s.sendall('ok')
        with open(file_name, 'rb') as f:
            data = f.read()
        s.sendall('%16d' % len(data))
        s.sendall(data)
        s.recv(2)

    if cmd == 'end':
        s.close()
        c.close()
        break
Run Code Online (Sandbox Code Playgroud)

客户:

import socket

s = socket.socket()
s.connect(('192.168.1.2', 1234))

def get_file(s, file_name):
    cmd = 'get\n%s\n' % (file_name)
    s.sendall(cmd)
    r = s.recv(2)
    size = int(s.recv(16))
    recvd = ''
    while size > len(recvd):
        data = s.recv(1024)
        if not data: 
            break
        recvd += data
    s.sendall('ok')
    return recvd

print get_file(s, 'file1')
print get_file(s, 'file2')
s.sendall('end\n')
Run Code Online (Sandbox Code Playgroud)

Hyp*_*eus 4

来回发送“ok”本质上作为停止位来分解数据流是一种合理的技术吗?

大多数协议使用某种终止符或其他终止符。流行的替代方案是 '\r\n'、'\r\n\r\n' 或 EOF (ctrl+d),但这些只是任意选择,并不比你的 'ok' 更差或更好,只要你的客户服务器知道如何处理它。