接收文件并将其保存在套接字 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')
  1. 但是保存的文件看起来很奇怪。当服务器发送一个 3,755KB 的文件时,客户端将写入两个 192KB 和 3,563KB 的文件。更糟糕的是,更大的崩溃了。有解决这个问题的方法吗?我不知道为什么我的代码会发生这种情况。
  2. 这是输入99999999值以获取整个文件而不剪切的唯一方法吗?
  3. 为什么我的客户端没有向服务器发送消息,即使我在服务器中编写了一些代码?

TCP不是基于消息的协议,而是字节流协议。sendsendall多少与recv一起读取多少之间没有固定的关系。

为了通过同一连接发送多个消息(文件(,您必须定义一些应用程序协议,该协议清楚地定义了消息的开始和结束位置。另一种方法是为每个文件使用新的TCP连接并读取直到recv返回'',即指示其他站点已关闭连接。

相关内容

最新更新