Обмен данными между клиентом и сервером через сокет с небольшим размером буфера и «пока верно…перерыв»: на стороне клиента все в порядке. Застрял на стороне сервера

#python #sockets #recv

Вопрос:

У меня есть следующий настроенный обмен:

  1. server BIND/LISTEN;
  2. клиент ОТПРАВЛЯЕТ;
  3. сервер RECV;
  4. сервер ОТПРАВЛЯЕТ;
  5. клиент RECV;
  6. клиент/сервер ЗАКРЫВАЕТСЯ.

Обмен проходит успешно с использованием большого буфера, который позволяет осуществлять одну передачу, но теперь я хочу иметь возможность успешно передавать фрагменты. Для этого я реализую следующее

 def accumulate_incoming(socket, buffer_size):
    result = b""
    while True:
        response = socket.recv(buffer_size) #receive some data 
        if not response:
            break
        else:
            result  = response
            print(f" {len(response)}b of output: {response}")
    result = repr(result) #decode to string
    return result
 

Использование на стороне клиента:

 socket.send(request)
response = accumulate_incoming(socket, buffer_size)
 

Использование на стороне сервера:

 connection = False
while not connection:
    connection, addy = socket.accept()

if buffer_size < 0:
    raise BaseException("Buffer cannot be a negative size.")
elif buffer_size < 500:
    received_msg = accumulate_incoming(connection, buffer_size)
else:
    received_msg = connection.recv(buffer_size)
 

Используя метод accumulate_incoming() небольшой буфер только для клиента, обмен проходит успешно. Ниже приведен вывод на стороне сервера.

 I am the server, awaiting news from my client, a spy that has invaded the enemy territory.

Recieved the following transmission from client: I overheard that the enemy will attack at dawn.
Now replying...
server closed.
 

Используя функцию accumulate_incoming() только для сервера, exchange зависает на стороне сервера. Вывод выводит полученное сообщение клиента, а затем зависает на новой строке:

 I am the server, awaiting news from my client, a spy that has invaded the enemy territory.

 8b of output: b'I overhe'
 8b of output: b'ard that'
 8b of output: b' the ene'
 8b of output: b'my will '
 8b of output: b'attack a'
 7b of output: b't dawn.'
 

Когда я прерываю серверную программу, я вижу, что она постоянно висит на следующей строке «Накопление входящих».

   response = socket.recv(buffer_size) #receive some data 
KeyboardInterrupt
 

Итак, если он получает что-то другое, кроме нетипа, почему сценарий не продолжает выполнение остальной части цикла «while True»? Каково возвращаемое значение, из-за которого оно зависает, но не может быть напечатано?

Комментарии:

1. может быть, попробуйте установить тайм-аут для сокета, чтобы он перестал ждать ввода?