2013-09-29 38 views
0

我有一个二进制文件和一个原始数据列表。我想插入文件块之间的列表元素,然后通过套接字传输它。我想使用套接字作为服务器和客户端之间的管道。使用Python,我怎样才能通过套接字流式传输其他数据的文件块?

我想发送文件块和原始数据块,而不是构造一个新文件并将其作为整体发送,因为原始文件已经很大。

如果文件的块是f1,f2,f3,f4,并且列表的数据是r1,r2,r3,r4,那么我想传输下列序列:r1,f1,r2,f2,r3,f3,r4, F4。

这里就是我想出了到目前为止(假设每块为1024字节)

服务器:

import socket 

list = [r1,r2,r3,r4] 

host= '' 
port = 8080 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host, port)) 
s.listen(1) 

conn = s.accept() 


with open(filepath,'rb') as file: 
    for i in range (0,len(list)): 
     file.seek(i*1024) 
     data = file.read(1024) + list[i] 
     conn.sendall(data) 

conn.close() 

客户:

import socket 

host = 'localhost' 
port = 8080 

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
socket.connect((host,port)) 


with open(filepath,'ab') as file: 
    data = socket.recv(1056) 
    if data: 
     file.write(data) 
    else: 
     break 

socket.close() 

有没有更简单的实现方式客户端和服务器之间的“管道”?

在任何情况下,客户端应该为每个(文件块,散列)对打开一个新的连接?

+1

如果您关闭连接,是的,必须做一个新的。至于数据,您可以使用2个套接字,一个用于文件,一个用于列表。或者构建自己的解析器(放置一个字符块,如MYDATA)并检查客户端,或者如果数据在1024b中分裂,读取1024作为数据,然后作为列表成员。但是,将列表作为固定长度的字符串发送,以便您知道数据再次开始的位置 – cox

回答

0

我想你正在做的是通过连接序列化数据。幸运的是,这是一个问题,谷歌有很多人使用Protobuf,Python内置了Pickle,并且Capt Proto中有新的参与者。检查出protobuf tutorial

相关问题