我有一个二进制文件和一个原始数据列表。我想在文件块之间插入列表的元素,然后通过套接字传输它。我想将套接字用作服务器和客户端之间的管道。
我想发送文件块和原始数据块,而不是构建一个新文件并将其作为一个整体发送,因为原始文件已经很大了。
如果文件的块是 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()
有没有更简单的方法在客户端和服务器之间实现"管道"?
在任何情况下,客户端都应该为每个(文件块、哈希)对打开一个新连接?
您正在尝试做的是通过连接序列化数据。幸运的是,这是一个很多人都有谷歌的问题,例如使用Protobuf,Python内置了Pickle,并且在Capt Proto中有一个新进入者。查看原型教程