Как справиться, когда клиент отправляет больше байтов, чем мы можем сохранить, и буфер перезаписывается? - PullRequest
0 голосов
/ 10 апреля 2019

У нас есть сокет в python3, который получает x байтов от клиента, наша проблема заключается в том, что клиент отправляет больше байтов, чем x, когда это происходит, наш буфер перезаписывается и мы теряем предыдущие байты.Нам нужен способ избежать потери первых байтов.Мы будем благодарны за любую помощь.Спасибо!

класс Connection (объект):

def __init__(self, socket, directory):
    self.sock = socket
    self.directory = directory

def handle(self):

    while(True):
        data =  self.sock.recv(4096)
        if len(data) > 0:
        ...

мы ожидаем, что сокет не получит сокет или каким-либо способом избежать потери байтов, которые у нас уже есть в буфере

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Вы можете сделать следующее:

def receivallData(sock, buffer_size=4096):
    buf = sock.recv(buffer_size)
    while buf:
        yield buf
        if len(buf) < buffer_size: break
        buf = sock.recv(buffer_size)

Подробнее об этом можно прочитать здесь:

Python Socket получает большой объем данных

0 голосов
/ 10 апреля 2019

вы можете следовать этой логике:

  • создать буфер, в котором вы храните все полученные данные
  • добавить данные, которые вы получаете на каждой итерации цикла, в этот буфер, чтобы вы не потеряли его
  • проверьте, получаете ли вы полные данные для обработки

В приведенном ниже примере объясняется, как создать буфер и добавить к нему данные (в примере я выхожу из цикла, если больше нет доступных данных на сокете или закрытом сокете)

total_data = []
while True: 
    data = self.sock.recv(4096)
    if not data: 
        break
    total_data.append(data)
    # TODO: add processing on total_data

print "".join(total_data)
...