From b3f0ccf42cae443312ec36309f25a8621ef3e9a8 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Tue, 15 Jan 2019 03:19:43 +0100 Subject: [PATCH] Refactor. --- server.py | 5 +---- server_/io.py | 59 +++++++++++++++++++++++---------------------------- 2 files changed, 28 insertions(+), 36 deletions(-) diff --git a/server.py b/server.py index ac26ca7..6eb7016 100755 --- a/server.py +++ b/server.py @@ -2,7 +2,6 @@ import sys import os import server_.game -import server_.io if len(sys.argv) != 2: @@ -31,6 +30,4 @@ else: game.io.handle_input('THING_POS 0 Y:3,X:3') game.io.handle_input('THING_TYPE 1 monster') game.io.handle_input('THING_POS 1 Y:1,X:1') - - -server_.io.run_server_with_io_loop(game) +game.io.run_loop_with_server() diff --git a/server_/io.py b/server_/io.py index 7a4c3b0..d2d67e9 100644 --- a/server_/io.py +++ b/server_/io.py @@ -10,15 +10,11 @@ import parser socketserver.TCPServer.allow_reuse_address = True -# Our default server port. -SERVER_PORT=5000 - - class Server(socketserver.ThreadingTCPServer): """Bind together threaded IO handling server and message queue.""" - def __init__(self, queue, *args, **kwargs): - super().__init__(('localhost', SERVER_PORT), IO_Handler, *args, **kwargs) + def __init__(self, queue, port, *args, **kwargs): + super().__init__(('localhost', port), IO_Handler, *args, **kwargs) self.queue_out = queue self.daemon_threads = True # Else, server's threads have daemon=False. @@ -126,6 +122,31 @@ class GameIO(): elif command_type == 'COMMAND': self.handle_input(content, connection_id) + def run_loop_with_server(self): + """Run connection of server talking to clients and game IO loop. + + We have the TCP server (an instance of Server) and we have the + game IO loop, a thread running self.loop. Both communicate with + each other via a queue.Queue. While the TCP server may spawn + parallel threads to many clients, the IO loop works sequentially + through game commands received from the TCP server's threads (= + client connections to the TCP server). A processed command may + trigger messages to the commanding client or to all clients, + delivered from the IO loop to the TCP server via the queue. + + """ + q = queue.Queue() + c = threading.Thread(target=self.loop, daemon=True, args=(q,)) + c.start() + server = Server(q, 5000) + try: + server.serve_forever() + except KeyboardInterrupt: + pass + finally: + print('Killing server') + server.server_close() + def handle_input(self, input_, connection_id=None, store=True): """Process input_ to command grammar, call command handler if found.""" from inspect import signature @@ -179,29 +200,3 @@ class GameIO(): quoted += [c] quoted += ['"'] return ''.join(quoted) - - -def run_server_with_io_loop(game): - """Run connection of server talking to clients and game IO loop. - - We have the TCP server (an instance of Server) and we have the - game IO loop, a thread running Game.io.loop. Both communicate with - each other via a queue.Queue. While the TCP server may spawn - parallel threads to many clients, the IO loop works sequentially - through game commands received from the TCP server's threads (= - client connections to the TCP server). A processed command may - trigger messages to the commanding client or to all clients, - delivered from the IO loop to the TCP server via the queue. - - """ - q = queue.Queue() - c = threading.Thread(target=game.io.loop, daemon=True, args=(q,)) - c.start() - server = Server(q) - try: - server.serve_forever() - except KeyboardInterrupt: - pass - finally: - print('Killing server') - server.server_close() -- 2.30.2