Я хочу правильно закрыть клиентские соединения в простом чате клиент-сервер, не отключая время ожидания для их закрытия. К сожалению, соединение на сайте клиента не закрывается.
Код сервера
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 65432)
sock.bind(server_address)
sock.listen(1)
while True:
connection, client_address = sock.accept()
try:
while True:
data = connection.recv(1024)
print(data)
if data:
connection.sendall(data)
else:
break
finally:
connection.close()
Код клиента
import socket
import time
HOST = '127.0.0.1'
PORT = 65432
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'Hello world')
data = s.recv(1024)
print('Received', data)
time.sleep(5)
#s.sendall('Hello world, again'.encode())
s.close()
Запуск сервера приводит к:
tcp LISTEN 0 1 127.0.0.1:65432 0.0.0.0:*
После запуска клиента я ожидал того же состояния, но клиентское соединение открыто.
tcp LISTEN 0 1 127.0.0.1:65432 0.0.0.0:*
tcp TIME-WAIT 0 0 127.0.0.1:57794 127.0.0.1:65432
НО, если я раскомментирую следующую строку:
#s.sendall('Hello world, again'.encode())
Результат, как я и ожидал.
tcp LISTEN 0 1 127.0.0.1:65432 0.0.0.0:*
Почему соединение мгновенно закрывается с повторной отправкой данных и без тайм-аута?