Как корректно завершить серверный процесс python socket когда его процесс останавливают?
Мне нужно обработать внезапное отключение сервер сокета это значит отправить все неотправленные сообщения, закрыть клиентские сокеты, подождать пока завершаться клиентские потоки
У меня не получается придумать как это реализовать и тем более мне мешает accept, чтобы вызвать keyboard interrupt. Может нужно сделать сокет неблокирующим ?
Вот код:
import socket
import threading
sock_serv = socket.socket()
sock_serv.bind(('localhost', 222))
sock_serv.listen(5)
HEADER_SIZE = 10
def client_handler(conn, addr):
print(f'Got connection from {addr}')
full_message = b''
while True:
try:
data = conn.recv(4096)
except:
print(f'{addr} disconnected')
conn.close()
break
if not data:
conn.close()
break
full_message += data
if len(full_message) >= 10:
msg_len = HEADER_SIZE + int(full_message[:HEADER_SIZE])
if len(full_message) >= msg_len:
conn.sendall(full_message[:msg_len])
full_message = full_message[msg_len:]
while True:
connection, address = sock_serv.accept()
if connection:
threading.Thread(target=client_handler, args= (connection, address, )).start()
А вот код клиента:
import socket
HEADER_SIZE = 10
sock_serv = socket.socket()
sock_serv.connect(('localhost', 337))
full_message = b''
while True:
while True:
text = input('>>> ')
msg = f'{len(text):<10}' + text
sock_serv.send(msg.encode('utf-8'))
break
try:
data = sock_serv.recv(4096)
except ConnectionResetError:
print('Connection has been closed')
full_message += data
if len(full_message) >= 10:
msg_len = HEADER_SIZE + int(full_message[:HEADER_SIZE])
if len(full_message) >= msg_len:
payload = full_message[HEADER_SIZE:msg_len]
print(payload.decode('utf-8'))
full_message = full_message[msg_len:]