【发布时间】:2019-09-23 05:46:25
【问题描述】:
我尝试创建一个客户端服务器脚本来发送和接收一些文件。 场景是最初服务器自动向客户端发送一个 csv 文件, 客户端处理文件并发送回应答文件。
当我开始接收文件时,我可以看到文件的所有内容,但没有中断以继续下一个功能 用于发回应答文件 是服务器部分问题还是客户端问题或两者兼而有之?
客户
#GET THE WORK FILE
with open('received_file.csv', 'wb') as f:
print ('file opened')
while True:
data = s.recv(BUFFER_SIZE)
print('receiving data...')
print('data=%s', (data))
#data =''
if not data:
print('Successfully get the file')
break
f.write(data)
f.close()
只有当我放置 data=' ' 时它才会下一个但服务器不应该发送一个空数据包吗?如果接收到的文件超出正确的缓冲区大小,它将无法工作?
服务器
while True:
print('Starting is ',starting)
l = f.read(BUFFER_SIZE)
while (l):
self.sock.send(l)
print('Sending..')
l = f.read(BUFFER_SIZE)
if not l:
f.close()
starting = 0
del filenames[0]
print('Sending in over..')
self.getfile()
【问题讨论】:
-
您假设
recv将在读取所有数据后不返回任何数据。情况并非如此——它只会等待更多数据,因为它不知道数据何时结束。 How does the python socket.recv() method know that the end of the message has been reached? 的可能重复项 -
那么,如果我在接收到的数据的末尾放置一个 NULL 或其他内容并进行检查?
-
如何准确地确定消息的结尾取决于您的特定应用程序。您可能有一些消息结束标记并检查它(这对于二进制数据是不可能的,除非此标记以某种方式在数据中进行转义或编码),或者您可以在包含以下有效负载长度的消息中添加一些前缀.使用最适合您的用例 - 我自己更喜欢固定大小的长度前缀,因为它更易于实现(无需扫描所有接收到的数据以查找数据结束标记),适用于二进制数据,并且因为这种方式长度消息的早期已知。
-
你能给我一个固定大小长度前缀的例子吗?
-
struct.pack("H",len(data)) + data为数据添加 2 个字节长度的前缀
标签: python python-3.x sockets client-server