#python #sockets #recv
Вопрос:
У меня есть следующий настроенный обмен:
- server BIND/LISTEN;
- клиент ОТПРАВЛЯЕТ;
- сервер RECV;
- сервер ОТПРАВЛЯЕТ;
- клиент RECV;
- клиент/сервер ЗАКРЫВАЕТСЯ.
Обмен проходит успешно с использованием большого буфера, который позволяет осуществлять одну передачу, но теперь я хочу иметь возможность успешно передавать фрагменты. Для этого я реализую следующее
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. может быть, попробуйте установить тайм-аут для сокета, чтобы он перестал ждать ввода?