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)
来回发送“ok”本质上作为停止位来分解数据流是一种合理的技术吗?
大多数协议使用某种终止符或其他终止符。流行的替代方案是 '\r\n'、'\r\n\r\n' 或 EOF (ctrl+d),但这些只是任意选择,并不比你的 'ok' 更差或更好,只要你的客户服务器知道如何处理它。