Handle KeyboardInterrupt properly in server mainthread

This commit is contained in:
Xevion
2022-06-12 15:27:13 -05:00
parent 64a5dd8c20
commit bcf852d5aa

View File

@@ -1,10 +1,9 @@
import logging import logging
import socket import socket
import sys
import threading import threading
from shared import constants
from server import handler from server import handler
from shared import constants
host = constants.DEFAULT_IP host = constants.DEFAULT_IP
port = constants.DEFAULT_PORT port = constants.DEFAULT_PORT
@@ -12,6 +11,7 @@ port = constants.DEFAULT_PORT
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port)) server.bind((host, port))
server.listen(1) server.listen(1)
server.settimeout(0.5)
logger = logging.getLogger('server') logger = logging.getLogger('server')
logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG)
@@ -21,34 +21,37 @@ clients = []
# Receiving / Listening Function # Receiving / Listening Function
def receive(): def receive():
while True: try:
conn = None while True:
conn = None
try: try:
# Accept Connection # Accept Connection
logger.debug('Waiting for connections...') logger.debug('Waiting for connections...')
conn, address = server.accept() conn, address = server.accept()
logger.info(f"New connection from {address}") logger.info(f"New connection from {address}")
client = handler.Client(conn, address, clients) client = handler.Client(conn, address, clients)
clients.append(client) clients.append(client)
client.request_nickname() client.request_nickname()
# Inform all clients of new client, give new client connections list # Inform all clients of new client, give new client connections list
for client in clients: for client in clients:
client.send_connections_list() client.send_connections_list()
# Start Handling Thread For Client # Start Handling Thread For Client
thread = threading.Thread(target=client.handle, name=client.id[:8]) thread = threading.Thread(target=client.handle, name=client.id[:8])
thread.start() thread.start()
except KeyboardInterrupt: except socket.timeout:
logger.info('Server closed by user.') pass
if conn: except KeyboardInterrupt as e:
conn.close() raise e
break except Exception as e:
except Exception as e: logger.critical(e, exc_info=e)
logger.critical(e, exc_info=e) break
break except KeyboardInterrupt:
logger.info('User stopped server manually.')
return
if __name__ == '__main__': if __name__ == '__main__':