【问题标题】:Client python script is not doing Break when receiving data is over from server从服务器接收数据结束时,客户端 python 脚本不执行中断
【发布时间】: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


【解决方案1】:

我认为问题在于 break 命令正在退出 if 语句,而不是您打算中断的 while 循环

这是一个可能的解决方案

客户

with open('received_file.csv', 'wb') as f:
        print ('file opened')
        while_loop_status=True
        while while_loop_status:
            data = s.recv(BUFFER_SIZE)
            print('receiving data...')
            print('data=%s', (data))
            if not data:
                print('Successfully get the file')
                while_loop_status=False
            f.write(data)
        f.close()

在这里,您创建一个变量,用于确定是否继续 while 循环,称为“while_loop_status”,然后在需要中断循环时将其从 True 更改为 False。

【讨论】:

    猜你喜欢
    • 2019-08-13
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2018-08-10
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多