Как корректно завершить серверный процесс 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:]

Ответы (0 шт):