python - 接收文件并将它们保存在套接字 Python 上
问题描述
我的服务器正在发送名称为 file_1、file_2 等的一系列文件。发送套接字运行良好,我检查了这些文件是否正确。
服务器- 发送文件
f = open(new_filename, 'rb')
start_ts = ts
seconds += 1
try:
print('Sending %s' % new_filename)
conn.sendall(f.read(99999999))
f.flush()
f.close()
except socket.error:
if errno == errno.ECONNREFUSED:
print(os.strerror(socket.error.errno))
else:
raise
print('Send failed')
sys.exit()
在客户端,我想接收这些文件并将它们保存为我计算机上服务器上的方式(save_1,save_2,...)。
客户端- 接收文件并尝试保存它们
try:
client.send(b'Receiving Data...\n')
while True:
save_filename = 'savefolder/save_%i.pcap' % file_index
f = open(save_filename, 'wb')
data = client.recv(99999999)
f.write(data)
reply = b'Message Received.\n'
if not data:
break
client.sendall(reply)
f.close()
file_index += 1
except socket.timeout:
print('Done receiving.', end=' ')
client.close()
print('Client socket is closed')
- 但是保存的文件看起来很奇怪。当服务器发送一个 3,755 KB 的文件时,客户端写入两个 192 KB 和 3,563 KB 的文件。更糟糕的是,更大的一个崩溃。有解决办法吗?我不知道为什么我的代码会发生这种情况。
- 是否只有输入 99999999 值才能获得整个文件而不切割?
- 为什么即使我在那里写了一些代码,我的客户端也不向服务器发送消息?
解决方案
TCP 不是基于消息的协议,而是字节流协议。send
使用 读取多少或sendall
读取多少之间没有固定的关系recv
。
为了通过同一连接发送多个消息(文件),您必须定义一些应用程序协议,该协议清楚地定义消息的开始和结束位置。另一种方法是为每个文件使用一个新的 TCP 连接并读取直到recv
返回''
,即表示另一个站点已关闭连接。
推荐阅读
- visual-studio-code - 适用于 VSC IDE 的 Jupyterlab 目录
- git - 新分支在 Git 中创建时跟踪本地分支
- vba - 拆分函数中的类型不匹配
- android - Android验证apk签名
- javascript - 如何实现 OpenWeatherMap 2.0?
- python - 我可以将带有日期和值的 Pandas 数据框转换为 3d numpy 数组吗
- javascript - 如何访问具有列表类型数据列表的 Spring Model 对象?
- spring - Zookeeper服务器重启后Apache ignite客户端不会自动重新连接
- python - 使用python从Excel文件中提取图像
- linux - Linux内核代码动态测量与sha256